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

Java 从回调列表中删除侦听器最优雅的方法是什么,java,kotlin,listener,concurrentmodification,Java,Kotlin,Listener,Concurrentmodification,假设我有以下侦听器 interface MyListener { fun onResult(result: Int) } 我的类包含了这个监听器的列表 val MyListenerList = ArrayList<MyListener>() val MyListenerList=ArrayList() 我的疑问是:如果注册了侦听器的人想在启动回调(onResult)时注销它(将其从列表中删除),那么最优雅的方法是什么,请记住,在列表迭代运行时直接调用它将导致出现Conc

假设我有以下侦听器

interface MyListener {
    fun onResult(result: Int)
}
我的类包含了这个监听器的列表

val MyListenerList = ArrayList<MyListener>()
val MyListenerList=ArrayList()

我的疑问是:如果注册了侦听器的人想在启动回调(
onResult
)时注销它(将其从列表中删除),那么最优雅的方法是什么,请记住,在列表迭代运行时直接调用它将导致出现
ConcurrentModificationException

不要迭代
MyListenerList
,复制
MyListenerList
,然后迭代该副本。这样,可以在
MyListenerList
上进行删除,而不会导致
ConcurrentModificationException

例如:

ArrayList(MyListenerList).forEach { it.onRemove(n) }


你用什么语言?Java?我正在使用Kotlin:d谢谢你的回复,@hudsonb。我只是不想把它标记为正确的,因为我想检查是否还有其他优雅的方式,这就是它通常被支持的方式。您可以考虑的另一个选项是使用<代码> CopyOnWorksRayList,而不是<代码> ARARYLIST/<代码>。
MyListenerList.toArray().forEach { it.onRemove(n) }