( ПРИМЕЧАНИЕ : я обновил этот пост после того, как осознал несколько собственных ошибок, так что это не оригинал, а более изощренная)
Для этой цели я бы сделал два новых интерфейса, ListListener
и Listenable
, а затем я бы создал новый класс, такой как ListenableArrayList
, который обернул бы каждый List
метод вызовом одного (или более). соответствующие методы определены в ListListener
. В коде это будет примерно так:
public class ListenableArrayList<T> extends ArrayList<T>
implements Listenable<T> {
private ArrayList<T> internalList;
private ListListener<T> listener;
/* .. */
public void add(T item) {
listener.beforeAdd(T item);
internalList.add(item);
listener.afterAdd(T item);
}
/* .. */
public void setListener(ListListener<T> listener) {
this.listener = listener;
}
}
public interface ListListener<T> {
/* .. */
void beforeAdd(T item);
void afterAdd(T item);
/* .. */
}
public interface Listenable<T> {
/* .. */
void setListener(ListListener<T> listener);
/* .. */
}
Причина, по которой я бы сделал это таким образом, состояла в том, чтобы позволить создавать действительно специальные слушатели на лету вместо привязки ListenableArrayList к какой-то конкретной реализации. Например, при этом возможно следующее:
Listenable<String> list = new ListenableArrayList<String>();
list.setListener(new ListListener<String>() {
@Override
public void beforeAdd(String item) {
System.out.println("About to add element "+item+"...");
}
@Override
public void afterAdd(String item) {
System.out.println("...element "+item+" has been added.");
}
});
Немного загромождено, может быть, но, с другой стороны, это позволило бы легко расширить Коллекции, Наборы и еще много чего.