gpt4 book ai didi

Java:通知提供者的实现 vs. hashCode-driven Map

转载 作者:行者123 更新时间:2023-11-30 06:38:54 25 4
gpt4 key购买 nike

我已经为一组通用监听器的通知实现了抽象通用提供程序 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() on listeners 为所有实例(空列表)返回相同的值,所以 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

什么是最好的解决方案?

  1. 使用另一个非 hashCode 支持集合 -- 但是 WeakHashMap对我来说太棒了,因为自动为我管理弱引用

  2. 使用非通用监听器,例如带有简单 equals() { return (this == object); } 的抽象类实现——但这不是那么灵活

  3. 使用简单的 equals() 为监听器使用一些包装器 -- 但此包装器不能对 addListener(E) 透明调用者由于弱引用

另一个想法?

最佳答案

WeakHashMap 有点坏了。它使用弱 key ,但不使用身份散列。除非你的键类型的 equals()hashCode() 使用“identity”,否则你不应该使用 WeakHashMap。相反,您需要的是 WeakHashMapIdentityHashMap 的组合。

一种可能是使用 MapMaker来自谷歌 Collection 。如果 key 是弱的或软的,它会自动使用 key 的身份散列/相等性。例如:

ConcurrentMap<K, V> myMap = new MapMaker().weakKeys().makeMap();

关于Java:通知提供者的实现 vs. hashCode-driven Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1709965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com