(注意:我在意识到自己的一些错误后更新了这篇文章,所以这不是原来的,而是更精致的)
为此,我会做两个新接口,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.");
}
});
可能有点混乱,但另一方面,这可以很容易地扩展到 Collections、Sets 等等。