オブザーバーパターンを実装するクラスにラップするよりも、Javaコレクションにリスナーを配置するより良い方法はありますか?
10576 次
5 に答える
13
Glazed Listsをチェックしてください
要素が追加、削除、置換されるたびにイベントを発生させる監視可能な List クラスが含まれています。
于 2009-12-21T20:04:37.483 に答える
6
GuavaのForwardingSet、ForwardingListなどを使用して、特定のインスタンスを目的の動作で装飾できます。
これは、プレーンな JDK API を使用するだけの私自身の実装です。
// create an abstract class that implements this interface with blank implementations
// that way, annonymous subclasses can observe only the events they care about
public interface CollectionObserver<E> {
public void beforeAdd(E o);
public void afterAdd(E o);
// other events to be observed ...
}
// this method would go in a utility class
public static <E> Collection<E> observedCollection(
final Collection<E> collection, final CollectionObserver<E> observer) {
return new Collection<E>() {
public boolean add(final E o) {
observer.beforeAdd(o);
boolean result = collection.add(o);
observer.afterAdd(o);
return result;
}
// ... generate rest of delegate methods in Eclipse
};
}
于 2009-12-21T20:05:50.030 に答える
2
「Commons-Events は、イベントを発生させて処理するための追加のクラスを提供します。Java Collections Framework に焦点を当て、イベントを発生させる他のコレクションにデコレータを提供します。」
于 2009-12-21T19:55:58.317 に答える
1
実際に java.util.Collection または List インスタンスが必要ない場合は、DefaultListModelを使用できます。組み込みのリスナー/オブザーバーサポートを備えた「実際の」コレクションの実装については知りません。
于 2009-12-21T19:43:12.300 に答える
0
これを達成するには多くの方法があります - 私はしばしばこのアプローチを使用します
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ObservableArrayList<E> extends ArrayList<E> {
private @interface MethodId {
private static final int REMOVE = 2;
private static final int ADD = 1;
}
public interface ListObserver<E> {
void onElementAdded(E element);
void onElementRemoved(E element);
}
public ObservableArrayList(int capacity) {
super(capacity);
ensureObserver();
}
public ObservableArrayList() {
ensureObserver();
}
public ObservableArrayList(Collection<? extends E> collection) {
super(collection);
ensureObserver();
}
private List<WeakReference<ListObserver<E>>> _listObserverWeakRefList;
public void addObserver(ListObserver<E> observer) {
_listObserverWeakRefList.add(new WeakReference<ListObserver<E>> (observer));
}
private void ensureObserver() {
if (_listObserverWeakRefList == null) {
_listObserverWeakRefList = new ArrayList<>();
}
}
@Override
public boolean add(E object) {
super.add(object);
callObservable(MethodId.ADD, object);
return true;
}
@Override
public boolean remove(Object object) {
boolean removed = super.remove(object);
if (removed) callObservable(MethodId.REMOVE, object);
return removed;
}
private void callObservable(@MethodId int methodId, Object element) {
for (WeakReference<ListObserver<E>> observerRef : _listObserverWeakRefList) {
ListObserver<E> observer = observerRef.get();
if (observer != null) {
switch (methodId) {
case MethodId.ADD:
observer.onElementAdded((E) element);
break;
case MethodId.REMOVE:
observer.onElementRemoved((E) element);
break;
}
}
}
}
}
于 2015-12-26T20:56:29.820 に答える