首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型ObjectPool -如何返回泛型类?

泛型ObjectPool -如何返回泛型类?
EN

Stack Overflow用户
提问于 2013-12-27 17:27:42
回答 3查看 463关注 0票数 7

我正在尝试开发一个ObjectPool,它可以与任何对象一起使用,而不需要更改池或对象的源--但我无法找到任何方法来编写get()-function (“主代码”从池获取某些对象),因为存在类型不匹配(不能从对象转换为TestObject)

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

ObjectPool:

代码语言:javascript
复制
public Object get() {
        int first = availableObjects.get(0);
        availableObjects.remove(0);
        return objects.get(first);
    }

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

主代码:

代码语言:javascript
复制
    TestObject test = objectPoolS.get();

如何使get()-Method更通用/更具体,使其在每次使用不同类时不对池进行调整而不对主代码进行解析?

更新:

对于这个池的一个更通用的版本,get()-method看起来如何呢?

(任何其他反馈都非常感谢!)

更新:下面MainCode的工作(固定)版本

更新2:

我刚刚意识到它不能像这样工作,我需要在池中创建新的对象--如果不对各种类型的对象进行池调整,这似乎是不可能做到的。

因此,我可以以某种方式删除池中所有对象之间的引用吗?(由于我使用baseObject初始化所有对象,实际上只有5个对1个对象的引用)

还是有更好的方法来管理它?(不强迫用户在代码中创建对象)

迄今完整的守则:

ObjectPool

代码语言:javascript
复制
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);
    }
}

母码(原件)

代码语言:javascript
复制
ObjectPoolS objectPoolS = new ObjectPoolS(new TestObject(0), 5, true);
TestObject test = objectPoolS.get();

主码(固定)

代码语言:javascript
复制
ObjectPoolS<TestObject> objectPoolS = new ObjectPoolS<TestObject>(new TestObject(0), 5, true);
TestObject test = objectPoolS.get();

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

误差

代码语言:javascript
复制
Type mismatch: cannot convert from Object to TestObject
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-28 18:10:34

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

泛型对象池如下所示:

代码语言:javascript
复制
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);
        }
    }
}

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

票数 3
EN

Stack Overflow用户

发布于 2013-12-28 17:28:20

哦,在你的主要代码里

代码语言:javascript
复制
ObjectPoolS objectPoolS = new ObjectPoolS(new TestObject(0), 5, true);

you must add "<TestObject>" and becomes

ObjectPoolS<TestObject> objectPoolS
=new ObjectPoolS<TestObject> (new TestObject(0),5,true);

just like where you declare ArrayList, it contains "<T>" and "<Integer>", isn't it?

但是,我认为您的原始代码应该没有问题。可能是另一个问题。

提示:在get()方法中,可以重写以下内容:

代码语言:javascript
复制
public T get(){
    return this.list.get(this.available.remove(0));
}
票数 3
EN

Stack Overflow用户

发布于 2013-12-27 17:32:17

你可以试试:

代码语言:javascript
复制
public <T> T get() {
    // Your code for objectToReturn
    return (T) objectToReturn;
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20805029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档