我正在尝试开发一个ObjectPool,可以在不更改Pool或Object的源的情况下将其与任何Object一起使用-但我找不到任何编写get() -function(“ Maincode”获取某些Object的方法由于存在类型不匹配(无法从Object转换为TestObject)
到目前为止,这是我的代码:
对象池:
public Object get() {
int first = availableObjects.get(0);
availableObjects.remove(0);
return objects.get(first);
}
在对象(ArrayList)中,池中有所有对象,availableObjects仅包含所有可用对象的列表。我基本上只是返回第一个可用对象并将其标记为不可用。
主码:
TestObject test = objectPoolS.get();
如何使get()- Method更通用/更特定,因此每次我使用不同的类时都无需适应池,也无需在主代码上进行解析就可以正常工作?
使用该池的更通用版本时,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
您不是在池化:您仅在使用对象的单个实例。
通用对象池如下所示:
public class ObjectPool<T> {
private List<T> objects;
private Class<T> clazz;
private int size;
public ObjectPool(Class<T> clazz, int size) throws IllegalStateException {
this.clazz = clazz;
this.size = size;
this.objects = new ArrayList<T>();
for (int i = 0;i < size;i++) {
objects.add(newInstance());
}
}
// You can override this method with anonymous class
protected T newInstance() {
try {
return clazz.newInstance()
} catch (Exception exception) {
throw new IllegalStateException(exception);
}
}
public synchronized T getInstance() {
if (objects.isEmpty()) {
return null;
}
return objects.remove(objects.size() - 1);
}
public synchronized void returnInstance(T instance) {
if (objects.size() < size) {
objects.add(instance);
}
}
}
不幸的是,我没有编译器来测试代码,但是它应该给您提示要更改的内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句