拥有收藏监听器的好方法?

有没有比将侦听器包装在实现观察者模式的类中更好的方法来在java集合上设置侦听器?


答案 1

你应该看看釉面列表

它包含可观察的 List 类,每当添加、删除、替换元素等时,这些类都会触发事件


答案 2

您可以使用 Guava 中的 ForwardingSetForwardingList 等来装饰具有所需行为的特定实例。

这是我自己的实现,只使用普通的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

    };
    }