2010-06-13 47 views
3

我正在创建一个基于事件的API,用户可以通过添加侦听器对象(在Java或C#中常见)来订阅事件。当事件发生时,所有订阅的侦听器都将与事件信息一起被调用。设计事件时,防止侦听器被添加两次是否是一个好主意?

我最初决定不要多次添加一个事件监听器。如果添加的侦听器已存在于侦听器集合中,则不会再次添加该侦听器。然而,在更多地思考它之后,似乎大多数基于事件的结构实际上并没有阻止这一点。我的初始本能是否错误?我不知道该走哪条路。我想我认为防止添加现有的侦听器将有助于避免常见的编程错误。再次,它也可能隐藏一个错误,当代码不应该运行时,它会导致代码被多次运行。

+0

看起来像一个dup http://stackoverflow.com/questions/1321296/when-registering-for-java-events-are-duplicate-listeners-typically-allowed – 2011-06-28 20:44:14

回答

1

我很欣赏已经给出的答案,但我想我会一起去阻止同一个听众被多次添加。 Java的Observable以这种方式运行,并且我正在使用CopyOnWriteArrayList作为已有此可用的侦听器的后备集合(addIfAbsent())。看起来不太可能有人真的希望多次添加同一个侦听器,并且通过创建另一个侦听器或在同一个侦听器中使用迭代来实现相同的行为很简单。我可以理解允许重复的论据(因此我怀疑),但不足以改变它。

2

我会猜想大多数事件系统只是不打扰。它需要一些努力来检测和阻止重复,并且只有非常(非常)很少有人会意外尝试多次举办活动。这样做的目的也很少,但它可以是有效的。

那么为什么要阻止一个罕见的但有效的用法来防止更罕见的错误?

总之,我认为你的“常见编程错误”不是很常见。

2

我同意Henk的观点,但是如果只有一个回调,那么取消注册回调会更简单。否则,您必须指定最后一个或第一个将被删除,或者它是任意的。 Java的Observable类以这种方式工作,如果Observer已在列表中,那么addObserverObserver是无操作的。然后再次,在我的Python代码中,我只是从列表中删除最后一个观察者副本,并允许重复,我从来没有找到一个好的用例,这取决于任何一种策略。

+0

我忘记了有关Observable。那么我想它可以以任何方式。 – 2010-06-14 00:09:38

相关问题