1

我正在尝试使用 apache commons pool 创建一个“对象”池。由于我已经有一个对象工厂,它接受一个字符串类型参数并创建一个正确类型的对象,我想使用这个工厂。

但问题是通用池对象的签名都不允许我传递一个带参数的工厂。

//This is a wrapper class that holds an Object pool
Class INService {

    private ObjectPool<INConnection> pool_ = null;

    /**
     * Constructs an instance of INService, given a pool size 
     * and a class which implements INHandler interface.
     * @param poolSize - size of the service pool 
     * @param c - the class which handles the INHandler service interface.
     */
    public INService(int poolSize, String objectType) {

        pool_ = new GenericObjectPool<INConnection>(factory, Objecttype); // won't compile.
    }
    ...
}

PoolableObjectfactory 接口定义了 makeObject、destroyObject、validateObject、activateObject 和 passivateObject 等方法。但是没有带参数的 makeObject() 方法。

似乎我能做到这一点的唯一方法是为每种类型的对象编写多个工厂类并编写 if-else 的东西,例如:

    public INService(int poolSize, String objectType) {

        if (objectType.equals("scap")
            pool_ = new GenericObjectPool<INConnection>(scapFactory);
        else if (objectType.equals("ucip")
            pool_ = new GenericObjectPool<INConnection>(ucipFactory);
        ...
    }

或者,有没有什么优雅的方法,而不是仅仅为了这个而复制/创建几个工厂类?

4

1 回答 1

2

您应该阅读KeyedObjectPool<K,V>也可以在 commons-pool 中找到的界面。

从它的javadoc:

A keyed pool pools instances of multiple types. Each type may be accessed using an arbitrary key.

然后,您可以实现 aKeyedPoolableObjectFactory<K,V>根据key参数创建实例,它具有makeObject(K key)您正在寻找的功能。

PS:您似乎没有将您的问题的任何答案标记为“已接受”,您可能想要解决这个问题。

于 2012-12-12T13:02:21.847 回答