Многие классы используют код, похожий на следующий, для запуска прослушивателей. (Примечание: это общий фрагмент)
private List<Listener> listeners = new ArrayList<Listener>();
public void fireListener() {
for(Listener l : listeners) l.someMethod();
}
Это работает нормально, пока слушатель не попытается добавить/удалить прослушиватель. Эта модификация из списка вызывает ConcurrentModificationException
. Должны ли мы обращаться с этим делом или должны ли изменения прослушивателей быть недействительными? Каким будет лучший способ обработки добавления/удаления слушателей?
Обновление Вот одно из возможных решений.
public void fireListener() {
for(Listener l : listeners.toArray(new Listener[listeners.size()])) {
if(!listeners.contains(l)) continue;
l.someMethod();
}
}