Przepraszamy za tytuł, prawdopodobnie zbyt ogólny.Najlepsze praktyki ActionListener
Już przeczytałem tutorial How to Write an Action Listener Java i już przeczytałem this question, ale wciąż mam pewne wątpliwości: Zastanawiałem się, które rozwiązanie jest najlepsze, gdy muszę wykonać tę samą akcję wiele razy.
Chciałbym ponownie użyć tego samego ActionListener
, ale nie jestem pewien, jak to osiągnąć w najlepszy sposób (mówiąc w kategoriach: czytelność kodu, wydajność kodu, wydajność i styl kodu).
Pierwszy „standardowy” kod (które chciałbym użyć, jeśli nie będę ponownie użyć słuchacza działania):
btnMenu.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
}
);
W ten sposób nic nie mogę ponowne Aw, ponieważ jest anonimowy wewnętrzna klasa ...
teraz mogę myśleć o następujących rozwiązań:
- Store odwołaniem od anonimowej klasy wewnętrznej w polu (który najprawdopodobniej będzie
static final
); - Napisz nową klasę, która implementuje interfejs
ActionListener
.
kod Przykład roztwór 1
public static final MENU_ACTION_LISTENER = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
};
btnMenu.addActionListener(MENU_ACTION_LISTENER);
przykłady w roztworze 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());
że pewne wątpliwości obu roztworów:
gdzie są przechowywane odniesienia do anonimowych słuchaczy akcji? Mogłem mieć jakąś klasę narzędziową (np.
ActionListenersUtil
), w której przechowywać wszystkie detektory działania, które chcę ponownie wykorzystać w polachstatic final
, ale nie podoba mi się to ... wydaje mi się złym projektem.większy sens, prawdopodobnie najlepiej podąża za Command Pattern ... Ja początkowo miał pewne wątpliwości na temat pakietów ... Chciałbym mieć wszystkie słuchaczy w osobnym opakowaniu (np
com.myapp.gui
dla elementów GUI icom.myapp.gui.listeners
dla Ale kiedy to zapisałem, zdałem sobie sprawę, że nie mam wyboru: jedyne miejsce, w którym ma sens, jest w tym samym pakiecie (ponieważ muszą być one musi być paczką-prywatną), nawet jeśli ze względu na porządek bym miał lubię umieszczać je wszystkie w osobnym pakiecie Nadal mam pewne wątpliwości, ponieważ większość detektorów akcji może być ponownie użyta, nawet w przypadku zmian GUI, ale nadal dobrze byłoby mieć go w tym samym opakowaniu?
Kolejne pytanie: jaka jest różnica między wywołaniem btnMenu.addActionListener(MENU_ACTION_LISTENER);
i btnMenu.addActionListener(new MenuActionListener());
(mówienie w perspektywie JVM, klasa, klasa obciążenia kompilacji pamięci zajmowanej przez poszczególne klasy, zbieranie śmieci i tak dalej)?
Proszę o pomoc, jestem teraz tak zagubiony! :(
+1 Daje to również możliwość zmiany tekstu, ikony, statusu włączonego i innych właściwości wszystkich przycisków, do których "akcja" jest dołączona w tym samym czasie bez wielu połączeń. Dodatkowo można go dołączyć do pozycji menu i tak samo dobrze. – Brian
+1000 gdybym mógł ... ;-) –
@Brian bardzo dobra uwaga. Kopiuję-wkleiłem to w odpowiedzi, aby było bardziej kompletne – Robin