EnumSet wrapper per AbstractActions
-
29-09-2019 - |
Domanda
Mi piacerebbe caricare una serie di azioni di Swing in un contenitore in fase di esecuzione e di accesso da parte di un nome di costante come è possibile con un Enum. Lo scopo di questo sarebbe sia per limitare le azioni possibili e anche migliorare la leggibilità.
Inizialmente, stavo considerando una sorta di enum dinamica (vedi http://blog.xebia.com/2009/04/02/dynamic-enums-in-java/ ), ma come sottolinea Java Bevitore di sotto di questo non è necessaria in quanto le azioni rimangono invariati.
Idealmente, quello che mi piacerebbe fare è una sorta di involucro che contiene le istanze AbstractAction
che potrebbero essere abilitato / disabilitato ed essere in grado di fare riferimento a ciascuna azione attraverso un nome simbolico.
Modifica:. Domanda è stato riformulato
Soluzione
Si può fare qualcosa di simile:
public enum Actions {
COPY( new AbstractAction() {
public void actionPerformed(ActionEvent e) {
//do something
}
}),
PASTE( new PasteAction() );
public final AbstractAction action;
private Actions(AbstractAction action) {
this.action = action;
}
}
//...
Actions.COPY.action...;
E poi come altri hanno detto, usare l'enum in combinazione con un EnumSet o EnumMap. Personalmente, non vedo un enorme valore in esso oltre basta avere un paio di campi chiamati, senza un enum.
Credo che ciò che si vuole veramente è una sorta di registro Azione in questo modo:
public class ActionsManager {
private final Map<String, Action> actions;
private final Map<User, Set<String>> enabledActions;
public Action get(String id);
public void register(String id, Action action);
public void deregister(String id);
public boolean isEnabled(User user, Action action);
}
Attuazione lasciato come esercizio.