我想在运行时将一系列Swing动作加载到容器中,并使用枚举的常量名称访问它们。这样做的目的是既限制可能的行动,又提高可读性。
最初,我正在考虑一种动态枚举(参见http://blog.xebia.com/2009/04/02/dynamic-enums-in-java/),但正如Java Drinker在下面指出的那样,这是不必要的,因为行动保持不变。
理想情况下,我想要做的是一种包含AbstractAction
个实例的包装器,这些实例可以启用/禁用,并且能够通过符号名称引用每个操作。
编辑:问题已重新制定。
答案 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);
}
实施作为练习。