Mejores prácticas de ActionListener [cerrado]


Lo siento por el título, probablemente demasiado genérico.

Ya leiCómo escribir un oyente de acción Tutorial de Java y ya leí.esta pregunta, pero todavía tengo algunas dudas: me preguntaba qué solución es la mejor cuando tengo que realizar la misma acción varias veces.

Quisiera reutilizar lo mismoActionListener, pero no estoy seguro de cómo lograrlo de la mejor manera (hablando en términos de: legibilidad del código, mantenimiento del código, rendimiento y estilo del código).

Primero, el código "estándar" (que utilizaría si no voy a reutilizar el detector de acción):

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

De esta manera no puedo reutilizar nada obvio, ya que es una clase interna anónima ...

Ahora, puedo pensar en las siguientes soluciones:

Almacene una referencia de una Clase Interna Anónima en un campo (que probablemente serástatic final);Escribe una nueva clase que implemente.ActionListener interfaz.

Código de ejemplo para la solución 1:

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

btnMenu.addActionListener(MENU_ACTION_LISTENER);

Código de ejemplo para la solución 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());

Tengo algunas dudas sobre ambas soluciones:

¿Dónde almacenar referencias a oyentes de acción anónima? Podría tener una clase de utilidad (por ejemplo,ActionListenersUtil) donde almacenan todos los oyentes de acción que quiero reutilizarstatic final Campos, pero no me gusta ... me parece mal diseño.

Tiene más sentido, probablemente el mejor sigue elPatrón de comando... Inicialmente, tenía algunas dudas sobre los paquetes ... Me gustaría tener a todos los oyentes en un paquete separado (por ejemplo,com.myapp.gui para elementos gui ycom.myapp.gui.listeners para los oyentes. Pero cuando escribí esto, me di cuenta de que no tengo otra opción: el único lugar donde tiene sentido es en el mismo paquete (porquedebe ser paquete-privado), incluso si por el bien del pedido me hubiera gustado ponerlos a todos en un paquete separado. Sin embargo, aún tengo algunas dudas, porque la mayoría de los oyentes de acción pueden ser reutilizables incluso en caso de que la GUI cambie; ¿Todavía sería una buena idea tenerlo en el mismo paquete?

Otra pregunta: ¿cuál es la diferencia entre llamarbtnMenu.addActionListener(MENU_ACTION_LISTENER); ybtnMenu.addActionListener(new MenuActionListener()); (Hablando en términos de JVM, carga de clases, compilación de clases, memoria ocupada por cada clase, recolección de basura, etc.)

Por favor ayuda, estoy tan confundido ahora! :(

Respuestas a la pregunta(1)

Su respuesta a la pregunta