相关: Does java have a "LinkedConcurrentHashMap" data structure?
我正在寻找一个集合类来保存对事件监听器的引用。
理想情况下,我希望该集合具有以下属性(按优先顺序排列):
- 维护插入顺序。较早的监听器可能会取消该事件,从而阻止它传递给后来添加的监听器。如果使用诸如
HashSet
之类的类,其迭代器可能会以错误的顺序返回元素,这将会中断。 - 使用
WeakReference
以便监听器列表不会阻止监听器被垃圾回收。 - 该集合是一个
Set
,因此会自动删除重复项。 Iterator
是集合的线程安全快照,不受添加新监听器的影响。还允许在多个线程上传递事件。 (这不是必需的 - 我可以迭代该集合的一个克隆。)
我知道一些类满足部分但不是所有这些标准。示例:
java.util.LinkedHashSet
(#1 和 #3)java.util.WeakHashMap
,由Collections.newSetFromMap
包装(#2 和 #3)javax.swing.event.EventListenerList
(需要一些额外的同步)(#1 和 #4)java.util.concurrent.CopyOnWriteArraySet
(#1、#3 和 #4)
但#1 和#2 都没有。像这样的类(class)是否存在于某处的图书馆中?
最佳答案
您可以使用 WeakListeners(参见 http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/WeakListeners.html)和 CopyOnWriteArraySet。
- 在事件源中实现
remove(ListenerType listener)
方法。 在您的
register(SomeListener listener)
方法中,将 WeakListener 添加到集合中:listenerCollection.put((ListenerType)WeakListeners.create ( ListenerType.class, listener, this));
当真正的监听器从内存中移除时,弱监听器会收到通知,它会自行注销。 (这就是为什么它需要引用源 (this
) 来进行注册。)注销是通过调用源的 remove 方法使用反射完成的。
关于java - 适合 Java 事件监听器的集合类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2072714/