答案 1
侦听器列表成为列表(而不是集合)的一个重要原因也解释了为什么您经常看到它们被向后迭代。常见方案涉及侦听器在收到某些更改的通知时将自身作为侦听器删除。如果侦听器存储为列表并向前迭代(或存储为一个集合并以某种不确定的顺序迭代),则将自身作为侦听器删除将导致 ConcurrentModificationException。
因此,相反,侦听器存储为列表,并按向后顺序通知。然后,如果侦听器在收到通知时将自己从侦听器列表中删除,则不会导致 ConcurrentModificationException 或移动其他尚未通知的侦听器的索引。
答案 2
什么样的套装?应该所有侦听器都实现 equals 和 hashCode 以便使用哈希集,还是标识哈希集可以使用?将侦听器添加到列表的用例是否值得复杂性增加两倍?有没有一种简单的机制可以使集合安全,以防止在调用其处理程序期间添加或删除侦听器?
可能存在一些性能差异,但肯定有更复杂的设计,它强制将多个添加多个删除决策放入库中,而不是将其留给应用程序。
推荐