2010-08-17 5 views
0

Я хотел бы загрузить серию действий Swing в контейнер во время выполнения и получить к ним доступ с помощью имени константы, которое возможно с помощью Enum. Цель этого заключалась бы в том, чтобы как ограничить возможные действия, так и улучшить читаемость.Оболочка Enumset для AbstractActions

Первоначально я рассматривал своего рода динамическое перечисление (см. http://blog.xebia.com/2009/04/02/dynamic-enums-in-java/), но, как указывает Java Drinker, это необязательно, так как действия остаются неизменными.

В идеале, что бы я хотел сделать, это своего рода оболочка, содержащая AbstractAction экземпляры, которые могут быть включены/отключены и иметь возможность ссылаться на каждое действие через символическое имя.

Редактировать: Вопрос был переформулирован.

+0

Но разве набор возможных действий не ограничен? По крайней мере, для любого конкретного приложения? Не могли бы вы иметь стандартное статическое перечисление со всеми возможными действиями, а во время выполнения у вас есть подмножество разрешенных действий (EnumSet в java). Тогда вы можете проверить это, чтобы узнать, можете ли вы это сделать или нет. Предположим, я не знаю полной ширины вашей проблемы, хотя ... –

+0

Что именно ваши «Swing Actions»? Элементы меню и т. Д., Которые обращены к пользователю? –

+0

@ Java Drinker: Да, набор действий статичен по своей природе. Идеально было бы, чтобы Enum выступал в качестве оболочки для экземпляров Action, чтобы дать каждому Action символическое имя и загрузить его или включить в соответствии с данным пользователем. То, что я хочу сделать, вероятно, не нужно, и я соглашусь на решение с использованием Enumset. Я буду переформулировать свой вопрос с учетом этого. –

ответ

2

Вы можете сделать что-то вроде этого:

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...; 

И тогда, как другие говорили, использовать перечисление в сочетании с 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); 
} 

Осуществление в качестве упражнения.

+2

Из того, что я понимаю из вопроса, я согласен с этим. Если вы уже имеете дело с объектами Action, перечисления являются избыточными. Предложенный MarkManager ActionsManager был бы способ пойти. –

+0

Спасибо, Марк! Реестр действий - отличная идея. Я посмотрю, что возможно, и отправьте сообщение здесь позже. :) –

Смежные вопросы