有一个collections监听器的好方法?

有没有更好的方法在java集合上拥有一个监听器,而不是将它包装在一个实现观察者模式的类中?

你应该看看釉面列表

它包含可观察的List类,无论何时添加,删除,替换元素等,都会触发事件

您可以使用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 { 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  Collection observedCollection( final Collection collection, final CollectionObserver observer) { return new Collection() { 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 }; } 

Apache事件 。

“Commons-Events提供了用于触发和处理事件的附加类。它专注于Java Collections Framework,为其他集合提供装饰器来触发事件。”

好吧,如果您实际上不需要java.util.Collection或List实例,则可以使用DefaultListModel 。 我不知道任何具有内置监听器/观察器支持的“真实”Collection实现。

有很多方法可以实现这一点 – 通常我使用这种方法

 import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class ObservableArrayList extends ArrayList { private @interface MethodId { private static final int REMOVE = 2; private static final int ADD = 1; } public interface ListObserver { void onElementAdded(E element); void onElementRemoved(E element); } public ObservableArrayList(int capacity) { super(capacity); ensureObserver(); } public ObservableArrayList() { ensureObserver(); } public ObservableArrayList(Collection collection) { super(collection); ensureObserver(); } private List>> _listObserverWeakRefList; public void addObserver(ListObserver observer) { _listObserverWeakRefList.add(new WeakReference> (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> observerRef : _listObserverWeakRefList) { ListObserver observer = observerRef.get(); if (observer != null) { switch (methodId) { case MethodId.ADD: observer.onElementAdded((E) element); break; case MethodId.REMOVE: observer.onElementRemoved((E) element); break; } } } } }