(注:私は自分のいくつかの間違いに気付いた後にこの投稿を更新したので、これはオリジナルではなく、より洗練されたものです)
この目的のために、2つの新しいインターフェイスListListener
を作成してから、で定義された1つ(または複数)の関連メソッドの呼び出しですべてのメソッドをラップする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.");
}
});
少し雑然としていますが、一方で、コレクションやセットなどを簡単に拡張できるようになります。