【问题标题】:When designing an event, is it a good idea to prevent listeners from being added twice?在设计事件时,防止两次添加监听器是个好主意吗?
【发布时间】:2010-06-13 22:42:16
【问题描述】:

我正在创建一个基于事件的 API,用户可以通过添加侦听器对象来订阅事件(这在 Java 或 C# 中很常见)。引发事件时,将使用事件信息调用所有订阅的侦听器。

我最初决定避免多次添加事件侦听器。如果添加了监听器集合中已经存在的监听器,则不会再次添加。然而,在考虑了更多之后,似乎大多数基于事件的结构实际上并没有阻止这种情况。我最初的直觉错了吗?我不知道该走哪条路。我想我认为阻止添加现有侦听器将有助于避免常见的编程错误。再说一次,它还可以隐藏一个错误,该错误会导致代码在不应该运行的情况下多次运行。

【问题讨论】:

标签: events event-handling


【解决方案1】:

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

【讨论】:

  • 我忘记了 Observable。那么,我想它可以去任何一种方式。
【解决方案2】:

我会大多数事件系统只是不打扰。它需要一些努力来检测和阻止重复,并且只有非常(非常)很少有人会不小心尝试不止一次地为事件做广告。故意这样做也很少见,但它可能是有效的。

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

简而言之,我认为您的“常见编程错误”并不常见。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-11-28
      • 2017-12-07
      • 1970-01-01
      • 2020-06-13
      • 2017-01-25
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多