2012-09-17 34 views
8


Disculpa el título, probablemente demasiado genérico.Mejores prácticas de ActionListener

Ya leí How to Write an Action Listener tutorial de Java y ya leí this question, pero todavía tengo algunas dudas: me preguntaba qué solución es la mejor cuando tengo que realizar la misma acción varias veces.

Me gustaría volver a utilizar el mismo ActionListener, pero no estoy seguro de cómo lograr esto de la mejor manera (hablando en términos de: legibilidad del código, mantenimiento del código, rendimiento y estilo del código).

En primer lugar el código "estándar" (que yo usaría si yo no voy a volver a utilizar el oyente de action):

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

De esta manera no puedo volver a usar nada OBV, ya que es un anónimo interior clase ...

Ahora, puedo pensar en las siguientes soluciones:

  1. tienda una referencia de una clase interna anónima en un campo (que muy probablemente habrá static final);
  2. Escriba una nueva clase que implemente la interfaz ActionListener.

código de ejemplo para solución 1: código

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

btnMenu.addActionListener(MENU_ACTION_LISTENER); 

Ejemplo de 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:

  1. dónde almacenar referencias a los oyentes de acción anónimos? Podría tener una especie de clase de utilidad (por ejemplo, ActionListenersUtil) donde almacenar todos los escuchas de acción que quiero reutilizar en los campos static final, pero no me gusta ... me parece que tiene un diseño deficiente.

  2. tiene más sentido, probablemente el mejor sigue el Command Pattern ... Yo inicialmente tenía algunas dudas sobre los paquetes ... Me gustaría tener todos los oyentes en un paquete separado (por ejemplo com.myapp.gui de elementos de la GUI y para com.myapp.gui.listeners pero cuando escribí esto, me di cuenta de que no tenía otra opción: el único lugar donde tiene sentido está en el mismo paquete (porque debe ser ser paquete-privado), incluso si por el orden tuviera me gusta ponerlos todos en un paquete separado. Todavía tengo algunas dudas, porque la mayoría de los oyentes de acción pueden ser reutilizables incluso en caso de cambios en la GUI, ¿aún sería una buena idea tenerlo en el mismo paquete?

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

Por favor, ayuda, estoy tan confundido en este momento! :(

Respuesta

14

La mejor manera es crear un Action en lugar de un si tiene que adjuntarlo a botones, menús, ....Un Action es el modelo de un JButton, y el modelo está destinado a ser compartida

Esto también le da la capacidad de cambiar el texto, icono, estado habilitado, y otras propiedades de todos los botones que el Action está unido a al mismo tiempo sin múltiples llamadas. Además, se puede adjuntar a los elementos del menú y también.

Para crear un Action no tiene que empezar desde el principio. AbstractAction es un buen punto de partida. El Swing Action tutorial también es una buena lectura.

+3

+1 Esto también le brinda la posibilidad de cambiar el texto, el icono, el estado habilitado y otras propiedades de todos los botones a los que se adjunta 'Action' al mismo tiempo sin múltiples llamadas. Además, se puede adjuntar a los elementos del menú y también. – Brian

+1

+1000 si pudiera ... ;-) –

+0

@Brian muy buena observación. Lo copié en la respuesta para hacerlo más completo – Robin