Я пытаюсь разработать ObjectPool, который можно использовать с любым объектом без изменения источника ни пула, ни объекта, но я не могу найти способ написать функцию get() («Основной код» получает некоторый объект из пула), поскольку существует несоответствие типа (невозможно преобразовать из объекта в TestObject)
Вот мой код:
Объектный пул:
public Object get() {
int first = availableObjects.get(0);
availableObjects.remove(0);
return objects.get(first);
}
В objects (ArrayList) находятся все объекты в пуле, availableObjects просто содержит список всех доступных объектов. Я в основном просто возвращаю первый доступный объект и помечаю его как недоступный.
Основной код:
TestObject test = objectPoolS.get();
Как сделать метод get() более общим/конкретным, чтобы он работал без адаптации пула каждый раз, когда я использую другой класс, и без синтаксического анализа основного кода?
Обновление:
Как правильно будет выглядеть метод get() в более общей версии этого пула?
(Любые другие отзывы приветствуются!)
Обновление: Рабочая (исправленная) версия MainCode ниже
Обновление 2:
Я только что понял, что это не может работать так, мне нужно создавать новые объекты в пуле, что вряд ли возможно сделать без адаптации пула для каждого типа объектов. .
Могу ли я как-то удалить связь между всеми объектами в пуле? (Поскольку я использую baseObject для инициализации всех объектов, на самом деле у меня есть только 5 ссылок на 1 объект)
Или есть лучший способ управлять этим? (Не заставляя пользователя создавать объекты в своем коде)
Полный код до сих пор:
Объектный пул
public class ObjectPoolS<T> {
int numberOfObjects;
boolean autoExtending;
T baseObject;
ArrayList<T> objects;
ArrayList<Integer> availableObjects;
public ObjectPoolS(T baseObject, int capacity, boolean allowAutoExtending) {
this.numberOfObjects = capacity;
this.baseObject = baseObject;
this.autoExtending = allowAutoExtending;
objects = new ArrayList<T>(capacity);
availableObjects = new ArrayList<Integer>(capacity);
initialize(baseObject, capacity);
}
private void initialize(T baseObject, int capacity) {
// Initialize List of Objects
for(int i = 0; i < capacity; i++) {
objects.add(baseObject);
}
// Initialize Index of Objects
for(int i = 0; i < capacity; i++) {
availableObjects.add(new Integer(i));
}
}
public T get() {
int first = availableObjects.get(0);
availableObjects.remove(0);
return objects.get(first);
}
}
Основной код (исходный)
ObjectPoolS objectPoolS = new ObjectPoolS(new TestObject(0), 5, true);
TestObject test = objectPoolS.get();
Основной код (фиксированный)
ObjectPoolS<TestObject> objectPoolS = new ObjectPoolS<TestObject>(new TestObject(0), 5, true);
TestObject test = objectPoolS.get();
TestObject содержит только один int для целей тестирования.
Ошибка
Type mismatch: cannot convert from Object to TestObject
T
объявляется на уровне класса. - person Paul Bellora   schedule 27.12.2013class ObjectPool<T>
? Пожалуйста, добавьте к вашему вопросу SSCCE и ошибку компилятора. Я также рекомендую не принимать существующий ответ, потому что это небезопасное решение. - person Paul Bellora   schedule 28.12.2013