Следующий код взят из класса Oracle jdk1.8.0_40 AbstractListModel.Какова цель этого кода в JDK?
/**
* <code>AbstractListModel</code> subclasses must call this method
* <b>after</b>
* one or more elements of the list change. The changed elements
* are specified by the closed interval index0, index1 -- the endpoints
* are included. Note that
* index0 need not be less than or equal to index1.
*
* @param source the <code>ListModel</code> that changed, typically "this"
* @param index0 one end of the new interval
* @param index1 the other end of the new interval
* @see EventListenerList
* @see DefaultListModel
*/
protected void fireContentsChanged(Object source, int index0, int index1)
{
Object[] listeners = listenerList.getListenerList();
ListDataEvent e = null;
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == ListDataListener.class) {
if (e == null) {
e = new ListDataEvent(source, ListDataEvent.CONTENTS_CHANGED, index0, index1);
}
((ListDataListener)listeners[i+1]).contentsChanged(e);
}
}
}
Мои вопросы
- Почему начало итерации в
listeners.length - 2
чем оlisteners.length - 1
элемента? - Почему событие срабатывает для каждого другого элемента (
i -= 2
)? - Почему итерация идет в обратном порядке?
Ссылка на code in openjdk также.
Посмотрите на 'addListDataListener', чтобы понять, почему он реализован так. Также обратите внимание, что слушатели вызывают в обратном порядке их дополнение к модели. – KDM
Я полагаю, что вопрос о 'listeners.length - 2' и' i - = 2' связан. Я не могу проверить код прямо сейчас, но немедленное объяснение, о котором я могу думать, состоит в том, что, возможно, два элемента добавляются в 'listenerList' каждый раз, когда прослушиватель зарегистрирован, и только один из них должен быть уведомлен. – Chop
Javadoc и исходный код 'javax.swing.event.EventListenerList' предоставляют исчерпывающую документацию о том, почему экземпляр этого класса используется таким образом. –