7

プールもオブジェクトもソースを変更せずに任意のオブジェクトで使用できる ObjectPool を開発しようとしていますが、get()関数を記述する方法が見つかりません(「メインコード」でオブジェクトを取得するプールから) タイプの不一致があるため (オブジェクトからテストオブジェクトに変換できません)

これまでの私のコードは次のとおりです。

オブジェクトプール:

public Object get() {
        int first = availableObjects.get(0);
        availableObjects.remove(0);
        return objects.get(first);
    }

オブジェクト(ArrayList) にはプール内のすべてのオブジェクトがあり、availableObjectsは使用可能な すべてのオブジェクトのリストが含まれています。私は基本的に、最初に利用可能なオブジェクトを返し、それを利用不可としてマークしています。

メインコード:

    TestObject test = objectPoolS.get();


get() -Method をより一般的/具体的にして、別のクラスを使用するたびにプールを調整したり、メインコードを解析したりせずに機能するよう にするにはどうすればよいですか?


アップデート:

その Pool のより一般的なバージョンでは、get()メソッドはどのように正しく見えるでしょうか?
(その他のフィードバックは大歓迎です!)
更新:以下の MainCode の動作 (修正済み) バージョン

更新 2:
このようには機能しないことに気付きました。プールに新しいオブジェクトを作成する必要があります。これは、すべての種類のオブジェクトにプールを適応させずに行うことはほとんど不可能のようです。
プール内のすべてのオブジェクト間の参照を何らかの方法で削除できますか? (baseObject を使用してすべてのオブジェクトを初期化するため、実際には 1 つのオブジェクトへの参照が 5 つしかありません)
または、それを管理するためのより良い方法はありますか? (ユーザーにコード内のオブジェクトの作成を強制することなく)

ここまでの完全なコード:

オブジェクト プール

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
4

3 に答える 3

3

プーリングではありません。オブジェクトのインスタンスを 1 つだけ使用しています。

汎用オブジェクト プールは次のようになります。

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

残念ながら、コードをテストするためのコンパイラはありませんが、何を変更すればよいかのヒントが得られるはずです。

于 2013-12-28T18:10:34.673 に答える
3

ああ、あなたのメインコードで

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() メソッドでは、次のように書き換えることができます。

public T get(){
    return this.list.get(this.available.remove(0));
}
于 2013-12-28T17:28:20.443 に答える
-2

あなたが試すことができます :

public <T> T get() {
    // Your code for objectToReturn
    return (T) objectToReturn;
}
于 2013-12-27T17:32:17.490 に答える