java - 适合 Java 事件监听器的集合类

标签 java collections concurrency weak-references event-listener

相关: Does java have a "LinkedConcurrentHashMap" data structure?


我正在寻找一个集合类来保存对事件监听器的引用。

理想情况下,我希望该集合具有以下属性(按优先顺序排列):

  1. 维护插入顺序。较早的监听器可能会取消该事件,从而阻止它传递给后来添加的监听器。如果使用诸如 HashSet 之类的类,其迭代器可能会以错误的顺序返回元素,这将会中断。
  2. 使用 WeakReference 以便监听器列表不会阻止监听器被垃圾回收。
  3. 该集合是一个Set,因此会自动删除重复项。
  4. 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)是否存在于某处的图书馆中?

最佳答案

您可以使用 Wea​​kListeners(参见 http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/WeakListeners.html)和 CopyOnWriteArraySet。

  1. 在事件源中实现 remove(ListenerType listener) 方法。
  2. 在您的 register(SomeListener listener) 方法中,将 WeakListener 添加到集合中:

    listenerCollection.put((ListenerType)WeakListeners.create ( ListenerType.class, listener, this));

当真正的监听器从内存中移除时,弱监听器会收到通知,它会自行注销。 (这就是为什么它需要引用源 (this) 来进行注册。)注销是通过调用源的 remove 方法使用反射完成的。

关于java - 适合 Java 事件监听器的集合类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2072714/

相关文章:

java - Wildfly ContextService 并发 securityIdentity 为 null

java - 守护线程 Java

java - JPA 验证独特

java - 你如何序列化 Guava 集合?

C# 将可枚举转换为接口(interface)

scala - 调用保存在 map 中的函数

sorting - 我们可以使用两个标准来排序吗

java - 检查异常不会抛出并转为 RuntimeException

java - onMarkerClick 内的 Firebase 查询无法正常工作

Android:在 getView() 中执行异步操作的最佳实践