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

解决方案 »

  1.   

    对象池是什么?一般理解,就是将new好的对象缓存起来,谓之对象池
      

  2.   

    谢谢大家关注,对象池的作用是复用已创建的对象,避免频繁的创建和释放产生的开销。
    目前我设计的是这样的:
    有一个池对象接口IPoolable,它约定了所有池对象必须实现的公共方法,随后就是对象池ObjectPool,
    OjectPool的构造函数有2个参数,一个Class类型的参数和一个int类型的参数,ObjectPool有几个方法,最主要的2个方法就是getObject和returnObject,getObject的实现就是判断对象池内是否有挂起的对象,如果有则激活对象并抛出给调用者使用,如果没有则先判断对象池是否已满,如果未满则创建一个加入池并激活抛出去,如果已满则返回为null。
    returnObject就是将返还的池对象挂起。
    不知我这样设计是不是合理的呢?
    这个思路我目前遇到的难点就是在getObject的时候,如果目前对象池没有未激活的对象,而且对象池未满,我需要创建一个对象,但是如果池对象有参数我就不好处理应该传参的数量了。
      

  3.   

    不知道你要的是不是这样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});
      

  4.   

    意思就是这个意思,不过你这个方法之前也想到过,不过行不通。Constructor cons = classType.getConstructor(clazzs);
        return cons.newInstance(obj);你用的这个方式我不能用,因为我这个语言无法只通过类就得到类的构造函数。