0

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

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

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

编辑:问题已重新制定。

4

1 回答 1

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

实施留作练习。

于 2010-08-17T20:51:44.017 回答