为什么侦听器列表是列表?

乔纳斯·普拉卡(Joonas Pulakka):

为什么侦听器列表(例如,在Java中使用侦听器addXxxListener()以及removeXxxListener()用于注册和注销侦听器的列表)称为列表,并且通常实现为列表会不会一是更好的选择,因为在听众的情况下,有

  • 无论以什么顺序调用它们(尽管可能会有这样的需求,但它们都是特殊情况;普通的侦听器机制不提供此类保证),并且
  • 无需多次注册同一个侦听器(这样做是否会导致调用同一侦听器1次或N次,或者是一个错误,是另一个问题)

这只是传统问题吗?无论如何,集是某种形式的列表。有性能差异吗?通过迭代List比通过迭代更快或更慢Set是否占用更多或更少的内存?差异几乎可以忽略不计。

标记:

侦听器列表成为列表(而不是集合)的重要原因之一也解释了为什么您经常看到它们是从后向迭代的。常见的情况是,当侦听器收到某些更改通知时,其将自己从侦听器中移除。如果将侦听器存储为列表并向前迭代(或存储为一个集合并以不确定的顺序进行迭代),则将其自身删除为侦听器将导致ConcurrentModificationException。

因此,取而代之的是,将侦听器存储为列表,并以向后的顺序通知。然后,如果侦听器在收到通知时将其自身从侦听器列表中删除,则不会引发ConcurrentModificationException或移动其他尚未通知的侦听器的索引。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从侦听器列表中删除侦听器

蒲公英列表侦听器失败

多个列表项的单个侦听器

JQuery中的列表大小侦听器

TestNG中的默认侦听器是什么,在哪里可以找到此列表?

从回调列表中删除侦听器的最优雅方法是什么

为什么当我向上或向下滚动列表时,它会在我的自定义光标适配器中激活一个Switch侦听器?

为什么在注册事件侦听器并触发事件侦听器之前调用滚动事件?

将动态队列列表传递到队列侦听器

列表视图项单击侦听器不起作用

在项目上单击侦听器以扩展ArrayAdapter的列表视图

HTML元素列表上的事件侦听器

列表中每个复选框的onClick侦听器

查看当前附加的事件侦听器列表

单击列表视图中每个项目的侦听器

简单的事件系统,无法从列表中删除侦听器

同时使用列表和按钮的侦听器

为什么在Android侦听器上使用WeakReference?

为什么键侦听器不起作用?

为什么在Activity中通常实现android侦听器?

事件侦听器DOMNodeInserted被多次运行,为什么?

为什么事件侦听器无法读取属性?

函数的侦听器无法启动。为什么?

为什么mousedown事件侦听器通过函数运行?

为什么反应事件侦听器正在保存状态?

为什么电子邮件跟踪侦听器会阻止其他侦听器正常工作?

为什么NIO选择器总是侦听端口列表中的最后一个端口?

这是使用侦听器的更有效方法:使用匿名类或实现列表器

有什么想法为什么我的PayPal IPN侦听器自发开始引发错误?