Оболочка Enumset для абстрактных действий
-
29-09-2019 - |
Вопрос
Я бы хотел загрузить серию Swing-действий в контейнер во время выполнения и получить к ним доступ по постоянному имени, как это возможно с помощью перечисления.Целью этого было бы как ограничить возможные действия, так и улучшить читабельность.
Изначально я рассматривал своего рода динамическое перечисление (см. http://blog.xebia.com/2009/04/02/dynamic-enums-in-java/) но, как указывает Java Drinker ниже, в этом нет необходимости, поскольку действия остаются неизменными.
В идеале, то, что я хотел бы сделать, - это своего рода оболочка, которая содержит AbstractAction
экземпляры, которые могут быть включены / отключены и иметь возможность ссылаться на каждое действие через символическое имя.
Редактировать:Вопрос был переформулирован.
Решение
Вы можете сделать что-то вроде этого:
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...;
И затем, как говорили другие, используйте enum в сочетании с EnumSet или EnumMap.Лично я не вижу в этом большой ценности по сравнению с простым наличием нескольких именованных полей без перечисления.
Я думаю, что то, чего вы действительно хотите, - это какой-то реестр действий, подобный этому:
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);
}
Реализация оставлена как упражнение.