Najlepsze praktyki ActionListener [zamknięte]


Przepraszam za tytuł, prawdopodobnie zbyt ogólny.

Już czytałemJak napisać nasłuch akcji samouczek Java i już czytałemto pytanie, 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 to samo wykorzystać ponownieActionListener, ale nie jestem pewien, jak to osiągnąć w najlepszy sposób (mówiąc w kategoriach: czytelności kodu, trwałości kodu, wydajności i stylu kodu).

Najpierw „standardowy” kod (którego użyłbym, jeśli nie zamierzam ponownie używać słuchacza akcji):

btnMenu.addActionListener(
    new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Navigator.showMenu();
        }
    }
);

W ten sposób nie mogę ponownie użyć niczego obv, ponieważ jest to anonimowa klasa wewnętrzna ...

Teraz mogę wymyślić następujące rozwiązania:

Zapisz referencję Anonimowej Klasy Wewnętrznej w polu (najprawdopodobniej tak będziestatic final);Napisz nową klasę, która implementujeActionListener berło.

Przykładowy kod rozwiązania 1:

public static final MENU_ACTION_LISTENER = new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        Navigator.showMenu();
    }
};

btnMenu.addActionListener(MENU_ACTION_LISTENER);

Przykładowy kod rozwiązania 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());

Mam wątpliwości co do obu rozwiązań:

Gdzie przechowywać odwołania do anonimowych detektorów akcji? Mógłbym mieć rodzaj klasy użytkowej (np.ActionListenersUtil) gdzie przechowują wszystkie detektory akcji, w których chcę ponownie użyćstatic final pola, ale nie podoba mi się ... wydaje mi się kiepski projekt.

To ma więcej sensu, prawdopodobnie najlepiej podąża zaWzór polecenia... Początkowo miałem wątpliwości co do pakietów ... Chciałbym mieć wszystkich słuchaczy w osobnym pakiecie (np.com.myapp.gui dla elementów gui icom.myapp.gui.listeners dla słuchaczy. Ale kiedy to spisałem, zdałem sobie sprawę, że nie mam wyboru: jedyne miejsce, w którym ma to sens, znajduje się w tym samym pakiecie (ponieważ onemusi być pakietem prywatnym), nawet jeśli dla porządku chciałbym umieścić je wszystkie w osobnym pakiecie. Nadal mam jednak pewne wątpliwości, ponieważ większość słuchaczy akcji może być wielokrotnego użytku, nawet w przypadku zmiany GUI; nadal dobrze byłoby mieć go w tym samym pakiecie?

Kolejne pytanie: jaka jest różnica między wywołaniembtnMenu.addActionListener(MENU_ACTION_LISTENER); ibtnMenu.addActionListener(new MenuActionListener()); (mówienie w kategoriach JVM, ładowanie klas, kompilowanie klas, pamięć zajmowana przez każdą klasę, zbieranie śmieci itd.)?

Proszę, pomóż, jestem teraz zdezorientowany! :(

questionAnswers(1)

yourAnswerToTheQuestion