乔纳斯·普拉卡(Joonas Pulakka):
为什么侦听器列表(例如,在Java中使用侦听器addXxxListener()
以及removeXxxListener()
用于注册和注销侦听器的列表)称为列表,并且通常实现为列表?会不会一集是更好的选择,因为在听众的情况下,有
- 无论以什么顺序调用它们(尽管可能会有这样的需求,但它们都是特殊情况;普通的侦听器机制不提供此类保证),并且
- 无需多次注册同一个侦听器(这样做是否会导致调用同一侦听器1次或N次,或者是一个错误,是另一个问题)
这只是传统问题吗?无论如何,集是某种形式的列表。有性能差异吗?通过迭代List
比通过迭代更快或更慢Set
?是否占用更多或更少的内存?差异几乎可以忽略不计。
标记:
侦听器列表成为列表(而不是集合)的重要原因之一也解释了为什么您经常看到它们是从后向迭代的。常见的情况是,当侦听器收到某些更改通知时,其将自己从侦听器中移除。如果将侦听器存储为列表并向前迭代(或存储为一个集合并以不确定的顺序进行迭代),则将其自身删除为侦听器将导致ConcurrentModificationException。
因此,取而代之的是,将侦听器存储为列表,并以向后的顺序通知。然后,如果侦听器在收到通知时将其自身从侦听器列表中删除,则不会引发ConcurrentModificationException或移动其他尚未通知的侦听器的索引。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
编辑于
我来说两句