1

apachecommonspoolを使用して「オブジェクト」のプールを作成しようとしています。文字列型の引数を取り、正しい型のオブジェクトを作成するオブジェクトファクトリがすでにあるので、このファクトリを使用したいと思います。

しかし、問題は、汎用プールオブジェクトのシグネチャのいずれも、引数を取るファクトリを渡すことができないことです。

//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.

次に、パラメータにKeyedPoolableObjectFactory<K,V>基づいてインスタンスを作成するように実装できます。これには、探している関数が含まれています。keymakeObject(K key)

PS:質問に対する回答に「承認済み」のマークを付けていないようですが、それに取り組むことをお勧めします。

于 2012-12-12T13:02:21.847 に答える