2012-02-05 10 views
1

これは簡単なことかもしれませんが、ちょっと混乱しています。私は自分のアプリケーションでメニューを作成しようとしています。特定の条件によっては、メニューのいくつかのオプションが有効/無効になります。コンソールベースなので、メニューの各「状態」にユーザーが使用できるコマンドを指定することも必要です。いくつかのオブジェクトを列挙型に添付するにはどうすればいいですか?

例:

EMPTY_STATEADD_COMMAND, REMOVE_COMMAND, QUIT_COMMAND
FULL_STATE私は私のアプリケーションは、私は簡単に複数の状態を追加して使用できるコマンドをカスタマイズすることができるという可能性を意味ほど柔軟になりたいADD_COMMAND, VIEW_COMMAND, REMOVE_COMMAND, QUIT_COMMAND

を持ってい。つまり、私はそれが実行されたアクションであることを知るためにifの列を行うことを避けたいと考えます。

各状態には異なるコマンドがあるので、私はこれらの異なる状態をカウントするStateという名前のENUMを作成すると考えました。 Commandsと呼ばれるENUMも作成しました。これには、アプリケーションの使用中にユーザーが実行できるすべてのコマンドが含まれています。

私の基本的な考え方は単純だった:、その後、

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

はこのように、国家は、コマンドをcountains、およびコマンドは、コマンドプレフィックス( "-add")の文字列である彼らのラベルを、countains

しかし、国家は多くのコマンドを数えることができ、それが問題です。

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

そして、私の質問はどこに行くことがある:私はとENUMに各ケースのコンストラクタを行うにはしたくないことはできませんので、私はそれを作る、すべてのコマンドをcountainしまうのArrayListを使用して考えましたドキュメンテーションによると、arraylistは、インターンの内容を割り当てるためにパラメータでコレクションを取ることができます。

これをきれいにして管理しやすくするために、どのように構成するべきかの提案がありますか?

答えて

2

各状態で使用可能なコマンドを保存すると何が問題になりますか?結局のところ、あなたはどこかでこれを定義しなければなりません。あなたはこのような各状態の列挙型のコンストラクタに利用可能なコマンドのEnumSetのを渡すことができ

:別の方法として

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

、あなたはそれが利用可能になる状態で、各コマンドに指定することができます。

+0

良いアイデアですが、私はenumSetの内部でenum値に簡単に到達できない方法が嫌いです(チェックされていますが、get()と同等のものは見つかりませんでした。元の列挙型の値は毎回です。もし1000のコマ​​ンドや状態があったら、問題はあります... –

+0

待っていますか?for for eachループの標準を使うのはどうですか?for(コマンドc:state.associatedEnumSet ()){何でもして...} ' –

関連する問題