关于对象池的问题 今天在实现一个对象池的时候遇到一个问题,我的想法是对象池的实现不会约束池对象构造函数的参数个数,这样就可以让使用者更加方便的设计自己的池对象,但是问题是,对象池如何根据池对象的构造函数参数列表来确定应该传几个参数,难点就是如何在创建一个对象之前,如何让程序自动识别要创建对象需要的参数个数。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 对象池是什么?一般理解,就是将new好的对象缓存起来,谓之对象池 谢谢大家关注,对象池的作用是复用已创建的对象,避免频繁的创建和释放产生的开销。目前我设计的是这样的:有一个池对象接口IPoolable,它约定了所有池对象必须实现的公共方法,随后就是对象池ObjectPool,OjectPool的构造函数有2个参数,一个Class类型的参数和一个int类型的参数,ObjectPool有几个方法,最主要的2个方法就是getObject和returnObject,getObject的实现就是判断对象池内是否有挂起的对象,如果有则激活对象并抛出给调用者使用,如果没有则先判断对象池是否已满,如果未满则创建一个加入池并激活抛出去,如果已满则返回为null。returnObject就是将返还的池对象挂起。不知我这样设计是不是合理的呢?这个思路我目前遇到的难点就是在getObject的时候,如果目前对象池没有未激活的对象,而且对象池未满,我需要创建一个对象,但是如果池对象有参数我就不好处理应该传参的数量了。 不知道你要的是不是这样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}); 意思就是这个意思,不过你这个方法之前也想到过,不过行不通。Constructor cons = classType.getConstructor(clazzs); return cons.newInstance(obj);你用的这个方式我不能用,因为我这个语言无法只通过类就得到类的构造函数。 计算天数代码 请教有过至少一年工作经验的朋友们 关于JInternalFrame的问题,之前点击的JInternalFrame总是会覆盖后来点击的 JMF录制视频报了一个An unexpected error,很诡异,敬请高手关注 谁给个JAVA的短信包 接口为什么还要用abstract修饰? 请教一道内存地址的问题 我是java的初学者 我的JTree响应无效!? 请问各位老鸟,我做VJA,想用版本控制器 请问如何显示图片? java图形界面程序用什么开发好
目前我设计的是这样的:
有一个池对象接口IPoolable,它约定了所有池对象必须实现的公共方法,随后就是对象池ObjectPool,
OjectPool的构造函数有2个参数,一个Class类型的参数和一个int类型的参数,ObjectPool有几个方法,最主要的2个方法就是getObject和returnObject,getObject的实现就是判断对象池内是否有挂起的对象,如果有则激活对象并抛出给调用者使用,如果没有则先判断对象池是否已满,如果未满则创建一个加入池并激活抛出去,如果已满则返回为null。
returnObject就是将返还的池对象挂起。
不知我这样设计是不是合理的呢?
这个思路我目前遇到的难点就是在getObject的时候,如果目前对象池没有未激活的对象,而且对象池未满,我需要创建一个对象,但是如果池对象有参数我就不好处理应该传参的数量了。
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});
return cons.newInstance(obj);你用的这个方式我不能用,因为我这个语言无法只通过类就得到类的构造函数。