Ci scusiamo per il titolo, probabilmente troppo generico.ActionListener best practice
Ho già letto il tutorial da Java e ho già letto this question, ma ho ancora qualche dubbio: mi chiedevo quale sia la soluzione migliore quando devo eseguire la stessa azione più volte.
Vorrei riutilizzare lo stesso ActionListener
, ma non sono sicuro su come ottenere ciò nel modo migliore (parlando in termini di: leggibilità del codice, maneggevolezza del codice, prestazioni e stile del codice).
Prima il codice "standard" (che userei se non ho intenzione di riutilizzare l'ascoltatore azione):
btnMenu.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
}
);
In questo modo non posso riutilizzare nulla OBV, dal momento che è un anonimo interno classe ...
Ora, mi vengono in mente le seguenti soluzioni:
- memorizzare un riferimento di un anonimo classe interna in un campo (che sarà molto probabilmente
static final
); - Scrivere una nuova classe che implementa l'interfaccia
ActionListener
.
codice Esempio per soluzione 1: codice
public static final MENU_ACTION_LISTENER = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
};
btnMenu.addActionListener(MENU_ACTION_LISTENER);
Esempio per soluzione 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());
ho qualche dubbio circa due soluzioni:
dove memorizzare riferimenti ad ascoltatori di azioni anonimi? Potrei avere una sorta di classe di utilità (ad esempio
ActionListenersUtil
) in cui archiviare tutti i listener di azioni che desidero riutilizzare nei campistatic final
, ma non mi piace ... mi sembra un design scadente.ha più senso, probabilmente la cosa migliore segue la Command Pattern ... Inizialmente ho avuto qualche dubbio sui pacchetti ... Mi piacerebbe avere tutti gli ascoltatori in un pacchetto separato (ad esempio
com.myapp.gui
per gli elementi GUI ecom.myapp.gui.listeners
per ascoltatori, ma quando ho annotato questo mi sono reso conto che non ho scelta: l'unico posto in cui ha senso è nello stesso pacchetto (perché lo deve essere pacchetto-privato), anche se per ordine avrei mi piace metterli tutti in un pacchetto separato Ho ancora qualche dubbio, perché la maggior parte degli ascoltatori di azioni può essere riusabile anche nel caso in cui la GUI cambi, sarebbe comunque una buona idea averlo nello stesso pacchetto?
Un'altra domanda: qual è la differenza tra chiamare btnMenu.addActionListener(MENU_ACTION_LISTENER);
e btnMenu.addActionListener(new MenuActionListener());
(parlando in termini di JVM, classe di carico, di classe la compilazione, la memoria occupata da ogni classe, raccolta dei rifiuti e così via)?
Per favore aiuto, sono così confuso adesso! :(
+1 In questo modo è anche possibile modificare il testo, l'icona, lo stato abilitato e altre proprietà di tutti i pulsanti a cui è collegato l'azione contemporaneamente senza più chiamate. Inoltre, può essere collegato a voci di menu e simili. – Brian
+1000 se potessi ... ;-) –
@Brian commento molto buono. Ho copiato e incollato nella risposta per renderlo più completo – Robin