我正在尝试使用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);
...
}
或者,有没有优雅的方式,而不是为了这个缘故复制/创建几个工厂类?
答案 0 :(得分:2)
您应该阅读KeyedObjectPool<K,V>
界面,该界面也可以在公共池中找到。
来自其javadoc:
A keyed pool pools instances of multiple types. Each type may be accessed using an arbitrary key.
然后,您可以实施KeyedPoolableObjectFactory<K,V>
根据key
参数创建实例,它具有您正在寻找的makeObject(K key)
功能。
PS:您似乎没有将您的问题的任何答案标记为“已接受”,您可能希望对此进行处理。