Javaでは、ランダムなループだけでなく、インスタンス自体も、メインループが完了した後に配列リスト内のクラスのインスタンスを削除したいと考えています。どうすればいいですか?
3 に答える
java の List クラスの remove メソッドは、「==」演算子によって決定されたとおりに、挿入した正確なオブジェクトを削除します。
このようなものがうまくいくかもしれません:
public interface IDeleteListener<T> {
void delete(SelfDeleteItem<T> item);
}
public class SelfDeleteItem<T> {
IDeleteListener<T> listener;
T item;
public SelfDeleteItem(T item) {
this.item = item;
}
public void fireDelete() {
listener.delete(this);
}
public void setDeleteListener(IDeleteListener<T> listener){
this.listener = listener;
}
}
public class DeleteList<T> {
private List<SelfDeleteItem<T>> items;
IDeleteListener<T> deleteListener;
public DeleteList() {
this.items = new ArrayList<SelfDeleteItem<T>>();
this.deleteListener = new IDeleteListener<T>() {
public void delete(SelfDeleteItem<T> item) {
items.remove(item);
}
};
}
public SelfDeleteItem<T> add(T item) {
SelfDeleteItem<T> test= new SelfDeleteItem<T>(item);
test.setDeleteListener(this.deleteListener);
this.items.add(test);
}
}
例:
DeleteList<String> list= //...
SelfDeleteItem<String> deleteItem = list.add("test");
deleteItem.fireDelete();
このコードが機能する方法は、ある値のインスタンスが DeleteList に追加されるたびに、それがラッパーの SelfDeleteItem に配置されることです。自己削除アイテムには、削除する必要があるときに通知するリスナーがあります。DeleteList は、SelfDeleteItem を削除する必要がある場合に自身をリスナーとして登録し、その場合は SelfDeleteItem の削除に進みます。
これにより、リスナーを介してアイテムからリストが分離され、アイテムがそれ自体を削除できるようにするという目標が達成されます。
用途に関しては、このアプローチはオーディオおよびネットワーク バッファ キャッシュに役立ちます。依存関係を作成せずにオブジェクトをキャッシュまたはキャッシュ解除できることが望ましいです。
クラス インスタンスは、それがリストにあることを認識している必要があります。おそらくクラスには、インスタンスがリストに追加されたときに呼び出されるメソッドがあります。次に、インスタンスがリストから自身を削除したい場合は、「mainList.remove( this );」のようなリストの「remove」メソッドを使用して削除します。
通常、クラス外からのリストの追加と削除を処理する必要があります。クラス インスタンスは、それがリストにあるかどうかを認識したり気にしたりしてはなりません。一方で、クラスが自分自身に気を配り、リストやその他の接続から自分自身を解きほぐす必要がある場合もあります。