AbstractActions的Enumset包装器

时间:2010-08-17 20:07:28

标签: java wrapper abstraction enumset

我想在运行时将一系列Swing动作加载到容器中,并使用枚举的常量名称访问它们。这样做的目的是既限制可能的行动,又提高可读性。

最初,我正在考虑一种动态枚举(参见http://blog.xebia.com/2009/04/02/dynamic-enums-in-java/),但正如Java Drinker在下面指出的那样,这是不必要的,因为行动保持不变。

理想情况下,我想要做的是一种包含AbstractAction个实例的包装器,这些实例可以启用/禁用,并且能够通过符号名称引用每个操作。

编辑:问题已重新制定。

1 个答案:

答案 0 :(得分: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结合使用。就个人而言,我没有看到它有一个巨大的价值,因为只有一些没有枚举的命名字段。

我认为你真正想要的是某种类型的Action注册表:

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);
}

实施作为练习。