【发布时间】:2009-11-10 18:03:57
【问题描述】:
我已经为一组通用侦听器E 实现了抽象通用提供程序,后代必须用特定的通知代码覆盖notifyListener(E)。对于听众的后备名单,我选择WeakHashMap<K,V>。侦听器必须作为弱引用:
abstract public class NotificationProvider<E> {
private Map<E, Object> listeners = new WeakHashMap<E, Object>();
public addListener(E listener) {
listeners.put(listener, null);
}
public void notifyListeners() {
for (E listener: listeners.keySet())
notifyListener(listener);
}
abstract protected void notifyListener(E listener);
}
典型用途:
NotificationProvider<MyListener> provider;
provider = new NotificationProvider<MyListener>() {
@Override
protected void notifyListener(MyListener listener) {
listener.myNotification();
}
}
provider.addListener(myListener1);
provider.addListener(myListener2);
provider.notifyListeners();
一切正常,但是当我需要AbstractList 后代类作为侦听器时,支持WeakHashMap 只接受一个侦听器实例!很明显 - 侦听器上的方法 hashCode() 和 equals() 为所有实例(空列表)返回相同的值,因此 WeakHashMap.put 仅替换之前添加的侦听器。
public class MyList extends AbstractList<MyItem> {
// some implementation
}
NotificationProvider<MyList> provider;
provider = new NotificationProvider<MyList>() {
@Override
protected void notifyListener(MyList listener) {
// some implementation
}
}
MyList list1 = new MyList();
MyList list2 = new MyList();
provider.addListener(list1);
provider.addListener(list2);
provider.notifyListeners(); // only list2 instance is notified
什么是最好的解决方案?
使用另一个非 hashCode 支持集合——但
WeakHashMap对我来说太棒了,因为自动为我管理弱引用使用非泛型监听器,例如具有简单
equals() { return (this == object); }实现的抽象类——但这不是那么灵活使用简单的 equals() 为侦听器使用一些包装器——但由于弱引用,此包装器不能对
addListener(E)调用者透明
其他想法?
【问题讨论】:
-
为了确保我理解问题:您是否尝试将 AbstractList 传递给您的 addListener() ?
-
不,我有 AbstractList 的后代(实际上是 AbstractListDecorator 的后代),它实现了一些特定的接口,这个接口是监听器类。
标签: java equals listener hashcode weak-references