Вопрос

Я бы хотел загрузить серию 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);
}

Реализация оставлена как упражнение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top