Почему 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 копируется при записи...

Слушатели попадают в стек. Поэтому, когда они получают уведомление, они "выталкиваются" из стека в обратном порядке, в котором они помещаются.

Если порядок слушателей имеет значение, вы должны попытаться решить это, не заботясь о том, в каком порядке они отмечены. Если это имеет значение, измените порядок добавления слушателей.

Другие вопросы по тегам