Почему fireTableChanged() в AbstractTableModel уведомляет слушателей в последнюю очередь?
Это неясно, но по какой-то причине уведомление в AbstractTableModel
последний к первому, вызывая ошибку в моем коде. Я могу это исправить, но мне интересно, если кто-нибудь знает, почему уведомление делается таким образом?
public void fireTableChanged(TableModelEvent e) {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==TableModelListener.class) {
((TableModelListener)listeners[i+1]).tableChanged(e);
}
}
}
2 ответа
Я не думаю, что есть реальная причина для этого.
Возможно, они хотели получить дополнительную безопасность в случае, если слушатель удаляет себя из списка слушателей, когда происходит событие (то есть, пока мы все еще перебираем список слушателей).
Хотя в этом нет необходимости, поскольку listenerList копируется при записи...
Слушатели попадают в стек. Поэтому, когда они получают уведомление, они "выталкиваются" из стека в обратном порядке, в котором они помещаются.
Если порядок слушателей имеет значение, вы должны попытаться решить это, не заботясь о том, в каком порядке они отмечены. Если это имеет значение, измените порядок добавления слушателей.