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) }