Generic ObjectPool - 如何返回泛型类?

Ben*_*alb 7 java generics object-pooling

我正在尝试开发一个ObjectPool,它可以与任何Object一起使用,而不会改变Pool和Object的来源 - 但我找不到任何方法来编写get() -function("Maincode"获取一些Object来自池)因为存在类型不匹配(无法从Object转换为TestObject)

这是我的代码到目前为止:

ObjectPool的:

public Object get() {
        int first = availableObjects.get(0);
        availableObjects.remove(0);
        return objects.get(first);
    }
Run Code Online (Sandbox Code Playgroud)

对象(ArrayList)中,池中有所有对象,availableObjects 只包含所有可用对象的列表.我基本上只是返回第一个可用对象并将其标记为不可用.

Maincode:

    TestObject test = objectPoolS.get();
Run Code Online (Sandbox Code Playgroud)


如何使get()- Method更通用/特定,以便每次使用不同的类而不在主代码上解析时,它都可以在不调整池的情况下工作?


更新:

使用该池的更通用版本,get()方法将如何正确显示?
(任何其他反馈非常感谢!)
更新:工作(固定)下面的MainCode版本

更新2:
我刚刚意识到它不能像这样工作,我需要在池中创建新的对象 - 如果没有为每种对象调整池,这似乎很难做到.
那么我可以以某种方式删除池中所有对象之间的引用吗?(因为我使用baseObject来初始化所有对象,实际上我只有5个对1个对象的引用)
或者有更好的方法来管理它吗?(不强制用户在其代码中创建对象)

完整代码到目前为止:

ObjectPool的

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

主要代码(原件)

ObjectPoolS objectPoolS = new ObjectPoolS(new TestObject(0), 5, true);
TestObject test = objectPoolS.get();
Run Code Online (Sandbox Code Playgroud)

主要代码(固定)

ObjectPoolS<TestObject> objectPoolS = new ObjectPoolS<TestObject>(new TestObject(0), 5, true);
TestObject test = objectPoolS.get();
Run Code Online (Sandbox Code Playgroud)

TestObject仅包含一个用于测试目的的int

错误

Type mismatch: cannot convert from Object to TestObject
Run Code Online (Sandbox Code Playgroud)

Sam*_*nen 3

您没有池化:您仅使用该对象的单个实例。

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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