2012-02-05 3 views
1

이제 간단 해 보일지 모르겠지만 약간 섞여 있습니다. 내 응용 프로그램에서 메뉴를 만들려고합니다. 특정 조건에 따라 메뉴의 일부 옵션이 활성화/비활성화됩니다. 콘솔 기반이기 때문에 사용자가 사용할 수있는 메뉴의 각 "상태"에 대해 지정하려고합니다.enum에 개체를 연결하는 방법은 무엇입니까?

예 :

EMPTY_STATEADD_COMMAND, REMOVE_COMMAND, QUIT_COMMAND
FULL_STATE 있음 ADD_COMMAND, VIEW_COMMAND, REMOVE_COMMAND, QUIT_COMMAND

나는 쉽게 더 상태를 추가하고 사용할 수있는 명령을 사용자 정의 할 수 있습니다 가능성의 의미로 유연하게 내 응용 프로그램을하고 싶습니다 . 그게 내가 취한 행동인지를 알기 위해서 칼럼을 쓰는 것을 피하고 싶다는 뜻입니다.

각 상태마다 다른 명령이 있기 때문에 나는 이라는 이름의 State을 생성하는 것을 생각했습니다. 또한 Commands이라는 ENUM을 만들었습니다. 여기에는 응용 프로그램을 사용할 때 사용자가 수행 할 수있는 모든 명령이 포함되어 있습니다.

내 기본 개념은 간단했다 :

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

은 따라서, 국가 countains 명령 및 명령은 ("-add") 명령 접두어의 캐릭터 그들의 라벨, 다음

하지만를 countains, 국가는 많은 명령을 쓸 수 있으며 이것이 문제입니다. 내가하고 ENUM에서 각각의 경우에 대한 생성자를하고 싶지 않아 할 수 없기 때문에, 나는 그것을 만드는 모든 명령을 countain 것 ArrayList에 사용에 대한 생각 :

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

을 그리고 내 질문이가는 곳이다 문서에서 알 수 있듯이, arraylist는 매개 변수로 인턴 콘텐츠를 할당 할 수 있습니다.

깨끗하고 관리하기 쉽게 구성해야하는 방법에 대한 제안 사항이 있습니까?

답변

2

각 상태에 사용할 수있는 명령을 저장하는 것이 잘못된 이유는 무엇입니까? 결국, 당신은 이것을 어디 선가 정의해야 할 것입니다.

는이 같은 각 국가 열거의 생성자에 사용할 수있는 명령의 각각 EnumSet을 전달할 수 있습니다

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

를 다른 방법으로, 당신이 사용할 수있는 상태에서 각 명령에 대해 지정할 수 있습니다.

+0

좋은 생각이지만 enumSet 내부에서 열거 형 값에 쉽게 도달 할 수없는 방식을 좋아하지 않습니다. (확인되었지만 get() 등가물을 찾지 못했습니다. for 루프 검증을 수행해야합니다. 원래의 Enum 값을 매번 사용합니다. 만약 내가 1000 개의 명령이나 상태를 가지고 있다면, 문제가있을 것입니다 ... –

+0

기다려주세요, 왜 그냥 for-each 루프를 사용하지 않으시겠습니까?'for (Command c : state.associatedEnumSet()) {무엇이든 할 ...}' –

관련 문제