addListener 方法在调用时是否应检查重复注册?如果是这样,发现重复时会发生什么?
final public class exampleCanFire {
public void addFooListener(FooListener listener) {
// Before adding listener to private list of listeners, should I check for duplicates?
}
}
答案 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的意思是你应该知道什么时候调用什么,然后冒重复听众的风险弄乱每个人产生的行为,但这就是为什么我们测试我们的程序,不是吗? - )