2012-02-05 100 views
1

現在聽起來很簡單,但我有點混淆。我正在嘗試在我的應用程序中創建一個菜單。根據特定條件,菜單的某些選項將被啓用/禁用。由於它是基於控制檯的,我還希望爲菜單的每個「狀態」指定哪些命令可供用戶使用。如何將一些或多個對象附加到枚舉?

例子:

EMPTY_STATEADD_COMMAND, REMOVE_COMMAND, QUIT_COMMAND
FULL_STATEADD_COMMAND, VIEW_COMMAND, REMOVE_COMMAND, QUIT_COMMAND

我想我的應用程序,以儘可能的意思,我可以輕鬆地添加更多的國家和定製,可以使用的命令靈活。這意味着我想避免做if的列以知道這是採取的行動。

由於每個州都有不同的命令,所以我想創建一個名爲StateENUM,它可以計算出這些不同的狀態。我還創建了ENUM,名爲Commands,其中包含用戶在使用我的應用程序時可以執行的所有可能的命令。

我的基本想法是簡單的:

EMPTY_STATE(Commands.ADD_COMMAND,Commands.REMOVE_COMMAND,Commands.QUIT_COMMAND) 

因此,國家countains命令和命令countains他們的標籤,這是命令前綴的字符串( 「-add」)

但隨後,各國可以數不勝數的命令,這就是問題所在。既然不能和不想在ENUM每種情況下做一個構造函數,我想過使用,將countain所有命令一個ArrayList,使其:

EMPTY_STATE(Arraylist array = commands) <-- Just the idea 

而這正是我的問題去如文檔所述,數組列表可以通過參數中的集合來分配其實體內容。

我可以提供一些建議,說明我應該如何構造它,使其易於管理?

回答

2

存儲每個狀態的可用命令有什麼問題?畢竟,你將不得不在某個地方定義它。

你可以傳遞一個EnumSet可用的命令來構造每個國家枚舉這樣的:

SOME_STATE(EnumSet.of(Command.A, Command.B)), 
OTHER_STATE(EnumSet.of(Command.A, Command.C)) 
... 

作爲替代方案,你可以指定每個命令在狀態時,它可用。

+0

一個好主意,但我不喜歡我不能輕易達到enumSet中枚舉值的方式(已檢查但未找到任何get()等價物。我不得不使用for循環驗證如果我有1000個命令或狀態,將會出現問題... – 2012-02-06 01:31:28

+0

等待,什麼?爲什麼你不使用標準for-each循環?for(Command c:state.associatedEnumSet ()){做任何事情}} – 2012-02-06 02:35:46