日期:2014-05-20  浏览次数:20759 次

关于对象池的问题
    今天在实现一个对象池的时候遇到一个问题,我的想法是对象池的实现不会约束池对象构造函数的参数个数,这样就可以让使用者更加方便的设计自己的池对象,但是问题是,对象池如何根据池对象的构造函数参数列表来确定应该传几个参数,难点就是如何在创建一个对象之前,如何让程序自动识别要创建对象需要的参数个数。

------解决方案--------------------
引用:
谢谢大家关注,对象池的作用是复用已创建的对象,避免频繁的创建和释放产生的开销。
目前我设计的是这样的:
有一个池对象接口IPoolable,它约定了所有池对象必须实现的公共方法,随后就是对象池ObjectPool,
OjectPool的构造函数有2个参数,一个Class类型的参数和一个int类型的参数,ObjectPool有几个方法,最主要的2个方法就是getObj……

不知道你要的是不是这样

Book:
private String name;
private String author;
private Integer number;
private Float length;
private Float width;
private Boolean isBorrowed;

public Book(String name, String author, Integer number, Float length,
Float width, Boolean isBorrowed) {
this.name = name;
this.author = author;
this.number = number;
this.length = length;
this.width = width;
this.isBorrowed = isBorrowed;
}

比如要生成一个Book的对象
ObjectPool的getObject()的方法:

/**
 * @param classType 要生成的Class对象
 * @param obj 生成对象所要带的参数
 */
public Object getObject(Class classType, Object[] obj){
// ……
// 判断池中是否已存在挂起的对象
// ……

// 如果池中没有挂起的对象,则需要新建对象
Class[] clazzs = new Class[obj.length];
for(int i = 0; i < obj.length; i++){
clazzs[i] = obj[i].getClass();
}
Constructor cons = classType.getConstructor(clazzs);
return cons.newInstance(obj);
}

使用:

Book book = (Book)ObjectPool.getObject(Book.class, new Object[]{"helloworld", "smith", 123, 23.5f, 18.0f, true});