你可以做這樣的事情:
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);
}
實現留作練習。
但是,這不是可能的行動限制?至少適用於應用程序的任何特定版本?你有沒有標準的靜態枚舉,所有可能的動作,並且在運行時你有一個允許的動作的子集(在Java中的EnumSet)。然後你可以檢查這個,看看你能不能。我想我不知道你的問題的全部範圍,但... – 2010-08-17 20:17:45
你的「Swing行動」究竟是什麼?菜單項目等面向用戶? – 2010-08-17 20:22:19
@Java Drinker:是的,這組動作本質上是靜態的。最理想的是Enum充當Action實例的包裝,爲每個Action賦予一個符號名稱並根據給定的用戶加載或啓用它們。我想要做的事情可能是不必要的,我會用Enumset解決問題。考慮到這一點,我將重新闡述我的問題。 – 2010-08-17 20:33:10