【发布时间】:2014-01-15 07:14:16
【问题描述】:
我正在尝试开发一个 ObjectPool,它可以与任何 Object 一起使用,而无需更改 Pool 或 Object 的源 - 但我找不到任何方法来编写 get()-function(“Maincode”从池中获取一些对象),因为存在类型不匹配(无法从对象转换为测试对象)
到目前为止,这是我的代码:
对象池:
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
【问题讨论】:
-
如果这将被多个请求调用,我会在这里看到一个线程问题。
-
所以我最好将它与 synchronized 一起使用?
-
是的,您需要同步该部分...您永远不想允许从列表中添加/删除超过 1 个线程...
-
还有其他问题吗?假设在类级别声明了一个类型参数
T,那么在您更新之后,您似乎走在了正确的轨道上。 -
主代码仍然存在我无法解决的类型不匹配
标签: java generics object-pooling