注册Java事件时,通常是否允许重复的侦听器?

时间:2009-08-24 09:17:52

标签: java events event-handling

addListener 方法在调用时是否应检查重复注册?如果是这样,发现重复时会发生什么?

final public class exampleCanFire {
    public void addFooListener(FooListener listener) {
      // Before adding listener to private list of listeners, should I check for duplicates?
    }
}

4 个答案:

答案 0 :(得分:4)

我的偏好是将它们存储在List中,而不是检查重复项。这种方法的一些优点:

  • 监听器以确定的顺序通知,并可能将事件标记为“已消耗”,导致它们不会传播给后续的侦听器。
  • 可以使用CopyOnWriteArrayList实现,它允许侦听器在通知回调期间删除自身而不会抛出ConcurrentModificationException(这是非常重要并且是经典的编写面向事件的代码时遇到了问题。

答案 1 :(得分:3)

我认为检测重复的侦听器没有指定的行为。我会说,除非你正在编写事件处理框架,否则最好不要打扰检查。如果一个类将自己注册为一个侦听器两次,那么它就是调用代码中的一个错误而不是可观察对象中的错误。

如果您确实想要做某事我只是建议抛出IllegalArgumentException,说明您无法两次注册同一个侦听器。

答案 2 :(得分:0)

将它们存储在Set中,并传播Set的响应:

Set<FooListener> listeners = new HashSet<FooListener>();

public boolean addFooListener(FooListener listener) {
  return listeners.add(listener);
}

答案 3 :(得分:0)

如果使用Lists发现比使用JAVA推荐的方法慢很多。我的猜测是JAVA的方法与内存或其他东西有更直接的交互。无论如何,我同意j_random_hacker的意思是你应该知道什么时候调用什么,然后冒重复听众的风险弄乱每个人产生的行为,但这就是为什么我们测试我们的程序,不是吗? - )