gpt4 book ai didi

java - Generic ObjectPool - 如何返回一个通用类?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:30:19 25 4
gpt4 key购买 nike

我正在尝试开发一个 ObjectPool,它可以与任何对象一起使用,而无需更改池和对象的源 - 但我找不到任何方法来编写 get()-函数(“Maincode”从池中获取一些对象)因为存在类型不匹配(无法从对象转换为 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

最佳答案

你不是在池化:你只是在使用对象的单个实例。

通用对象池看起来像这样:

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

不幸的是,我没有编译器来测试代码,但它应该会提示您要更改的内容。

关于java - Generic ObjectPool - 如何返回一个通用类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20805029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com