Лучшие практики ActionListener [закрыто]
Извините за название, возможно, слишком общий.
Я уже читаюКак написать слушателя действия учебник по Java и я уже читалэтот вопрос, но у меня все еще есть некоторые сомнения: мне было интересно, какое решение является лучшим, когда мне приходится выполнять одно и то же действие несколько раз.
хочу использовать то же самоеActionListener
, но я не уверен, как добиться этого наилучшим образом (говоря о терминах: читаемость кода, удобство использования кода, производительность и стиль кода).
Первый "стандарт» код (который я бы использовал, если бы яя не собираюсь повторно использовать слушателя действия)
btnMenu.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
}
);
Так я могуНичего не использовать повторно, так какs анонимный внутренний класс ...
Теперь я могу думать о следующих решениях:
Сохраните ссылку на Anonymous Inner Class в поле (которое, скорее всего, будетstatic final
);Написать новый класс, который реализуетActionListener
интерфейс.Пример кода для решения 1:
public static final MENU_ACTION_LISTENER = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
};
btnMenu.addActionListener(MENU_ACTION_LISTENER);
Пример кода для решения 2:
// package-private, only GUI-package classes should be able to use it.
// most likely I won't ever need to subclass it, so why not making it final?
final class MenuActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
}
// now, wherever I need to use it:
btnMenu.addActionListener(new MenuActionListener());
У меня есть некоторые сомнения по поводу обоих решений:
Где хранить ссылки на Anonymous Action Listeners? Я мог бы иметь своего рода служебный класс (например,ActionListenersUtil
) где хранятся все слушатели действий, в которых я хочу повторно использоватьstatic final
поля, но я немне это не нравится ... мне кажется, плохой дизайн.
Это имеет больше смысла, вероятно, лучше всего следуетШаблон команды... у меня изначально были некоторые сомнения по поводу пакетов ... яхотелось бы, чтобы все слушатели были в отдельном пакете (например,com.myapp.gui
для графических элементов иcom.myapp.gui.listeners
для слушателей. Но когда я записал это, я понял, что у меня нет выбора: единственное место, где это имеет смысл, находится в одном пакете (потому что онидолжен быть частным), даже если бы я хотел заказать их в отдельную упаковку. У меня все еще есть некоторые сомнения, потому что большинство слушателей действия могут быть повторно использованы даже в случае изменения GUI; все еще было бы неплохо иметь его в одной упаковке?
Другой вопрос: чтоРазница между звонкамиbtnMenu.addActionListener(MENU_ACTION_LISTENER);
а такжеbtnMenu.addActionListener(new MenuActionListener());
(если говорить о JVM, загрузке классов, компиляции классов, памяти, занятой каждым классом, сборке мусора и так далее)?
Пожалуйста, помогите, яя так растерялся прямо сейчас! :(