Apache Commons Pool - как использовать фабрику, которая принимает аргументы

Я пытаюсь использовать 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, activObject и passivateObject. Но нет метода makeObject(), который принимает параметры.

Кажется, что единственный способ сделать это - написать несколько классов фабрики для каждого типа объекта и написать что-то еще, например:

    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);
        ...
    }

Или есть какой-нибудь элегантный способ вместо дублирования / создания нескольких фабричных классов только ради этого?

1 ответ

Решение

Вы должны прочитать на 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: Похоже, вы не пометили ответы на свои вопросы как "принятые", возможно, вы захотите поработать над этим.

Другие вопросы по тегам