Лучшие практики 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 be static 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, загрузке классов, компиляции классов, памяти, занятой каждым классом, сборке мусора и так далее)?

Пожалуйста, помогите, я сейчас в замешательстве! :(

Ответы на вопрос(1)

Ваш ответ на вопрос