Events 在设计事件时,防止两次添加侦听器是否是一个好主意?

Events 在设计事件时,防止两次添加侦听器是否是一个好主意?,events,event-handling,Events,Event Handling,我正在创建一个基于事件的API,用户可以通过添加侦听器对象订阅事件(这在Java或C#中很常见)。引发事件时,将使用事件信息调用所有订阅的侦听器 我最初决定避免多次添加事件侦听器。如果添加的侦听器已存在于侦听器集合中,则不会再次添加该侦听器。然而,在仔细考虑之后,似乎大多数基于事件的结构实际上并没有阻止这一点。我最初的直觉错了吗?我不知道该走哪条路。我想我认为防止添加现有侦听器将有助于避免常见的编程错误。此外,它还可能隐藏一个错误,导致代码在不应该运行的情况下多次运行。我想大多数事件系统都不会麻

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

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

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

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


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

我同意Henk的观点,但再说一次,如果只有一个回调,则注销回调更简单。否则,您必须指定将删除最后一个或第一个,否则这是任意的。Java的
observatable
类就是这样工作的,如果列表中已经有一个
observator
addobservator
和该
observator
是不可操作的。然后,在我的Python代码中,我只需从列表中删除该observator的最后一个副本,并允许重复,我只是从来没有找到一个好的用例,它取决于两种策略。

我很欣赏大家给出的答案,但我想我会继续防止同一个侦听器被多次添加。Java的Observable就是这样运行的,我正在使用一个
CopyOnWriteArrayList
作为侦听器的支持集合,它已经有了这个可用的(
AddFabSent()
)。似乎不太可能有人真的希望多次添加同一个侦听器,通过创建另一个侦听器或在同一个侦听器中使用迭代来实现相同的行为很简单。我能理解允许重复的理由(因此我怀疑),但不足以改变它。

我已经忘记了可观察的。我想这两条路都可以走。看起来像是一个骗局