Существует ли лучший способ иметь слушателя на наборе Java, чем обертка это в классе, реализовывая шаблон "наблюдатель"?
Вы должны проверить Стеклянные списки
. Он содержит наблюдаемые классы списков, которые запускают события всякий раз, когда элементы добавляются, удаляются, заменяются и т. Д.
Вы можете использовать ForwardingSet , ForwardingList и т. Д. Из Guava , чтобы украсить конкретный экземпляр желаемым поведением. .
Вот моя собственная реализация, которая просто использует простые API-интерфейсы JDK:
// 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
};
}
«Commons-Events предоставляет дополнительные классы для запуска и обработки событий. Он фокусируется на Java Collections Framework, предоставляя декораторы для других коллекций, которые запускают события».
Что ж, если вам действительно не нужен экземпляр java.util.Collection или List, вы можете использовать DefaultListModel . Мне неизвестны «настоящие» реализации Collection со встроенной поддержкой слушателя / наблюдателя.