プールもオブジェクトもソースを変更せずに任意のオブジェクトで使用できる 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