1) Что именно делает DetailListener.class?
Из API :
Экземпляры класса Class представляют классы и интерфейсы в работающем приложении Java.
Это несколько сбивает с толку, поэтому давайте рассмотрим пример. Вызов DetailListener.class предоставляет его представление Class. В данном конкретном случае DetailListener.class
предоставляет Class<DetailListener>
, поэтому возможно сделать это:
Class<DetailListener> cdl = DetailListener.class;
cdl
- это просто еще одна переменная, аналогичная тому, как frame
- это просто еще одна переменная.
frame
это JFrame
, который предоставляет некоторые методы, в то время как cdl
это Class<DetailListener>
, который предоставляет другой набор методов.
Тип
cdl
- это Class<DetailListener>
, представляющий класс DetailListener
.
но я до сих пор не понимаю, что он делает в этой ситуации
Рассмотрим этот код:
listenerList.add(DetailListener.class, listener);
listenerList
относится к типу EventListenerList
. Согласно его API , для параметров метода add(...)
требуется экземпляр класса и T. В этом случае универсальным T является DetailListener. Пока слушатель зарегистрирован, но это приводит к вашему следующему вопросу.
# 2 Что именно делает метод fireDetailEvent ()?
Когда слушатель был зарегистрирован, listenerList
сохраняет внутренний массив, на который можно ссылаться позже. Массив содержит и класс, и фактический экземпляр прослушивателя. Итак, ссылаясь
Object[] listeners = listenerList.getListenerList();
обеспечивает доступ к массиву. В этом случае:
listeners[0] = DetailListener.class
listeners[1] = reference to the anonymous inner class instance created from detailsPanel.addDetailListener(...)
Таким образом, цикл в fireDetailEvent(...)
гарантированно будет кратен 2 (0 также работает, если нет зарегистрированных слушателей). Но listenerList
может содержать любого типа слушателя, поэтому
if (listeners[i] == DetailListener.class) {
использует класс для проверки на равенство, чтобы убедиться, что безопасно кастовать, чтобы иметь возможность передать DetailEvent
слушателю (который является следующим элементом в массиве). Использование ==
(вместо .equals()
) вполне допустимо в этом контексте, поскольку DetailListener.class всегда предоставляет один и тот же класс.