Лучшие практики ActionListener [закрыто]
Извините за название, возможно, слишком общий.
Я уже читаюКак написать слушателя действия учебник по Java и я уже читалэтот вопрос, но у меня все еще есть некоторые сомнения: мне было интересно, какое решение является лучшим, когда мне приходится выполнять одно и то же действие несколько раз.
Я хочу использовать то же самоеActionListener
, но я не уверен, как добиться этого наилучшим образом (говоря о терминах: читаемость кода, удобство использования кода, производительность и стиль кода).
Сначала «стандартный» код (который я использовал бы, если бы не собирался повторно использовать прослушиватель действий):
btnMenu.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
}
);
Таким образом, я не могу повторно использовать что-либо obv, так как это анонимный внутренний класс ...
Теперь я могу думать о следующих решениях:
Store a reference of an Anonymous Inner Class in a field (that will most likely bestatic final
);
Write a new class that implements ActionListener
interface.
Пример кода для решения 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());
У меня есть некоторые сомнения по поводу обоих решений:
Where to store references to Anonymous Action Listeners? I could have a sort of utility class (e.g. ActionListenersUtil
) where store all action listeners I want to reuse in static final
fields, but I don't like it... it seems to me poor design.
It makes more sense, probably best follows the Command Pattern... I initially had some doubt about the packages... I'd like to have all listeners in a separate package (e.g. com.myapp.gui
for gui elements and com.myapp.gui.listeners
for listeners. But when I wrote down this I realized that I have no choice: the only place where it make sense is in the same package (because they must be package-private), even if for the sake of order I would have like to put them all in a separate package.
I still have some doubt though, because most action listeners may be reusable even in case GUI changes; it still would be a good idea to have it in the same package?
Другой вопрос: в чем разница между звонкамиbtnMenu.addActionListener(MENU_ACTION_LISTENER);
а такжеbtnMenu.addActionListener(new MenuActionListener());
(если говорить о JVM, загрузке классов, компиляции классов, памяти, занятой каждым классом, сборке мусора и так далее)?
Пожалуйста, помогите, я сейчас в замешательстве! :(