Как прикрепить несколько или много объектов к перечислению? - PullRequest
1 голос
/ 06 февраля 2012

Теперь это может показаться простым, но я немного запутался. Я пытаюсь создать меню в моем приложении. В зависимости от определенных условий некоторые параметры меню будут включены / отключены. Поскольку он основан на консоли, я также хочу указать для каждого «состояния» меню, какие команды доступны пользователю.

Пример:

EMPTY_STATE имеет ADD_COMMAND, REMOVE_COMMAND, QUIT_COMMAND
FULL_STATE имеет ADD_COMMAND, VIEW_COMMAND, REMOVE_COMMAND, QUIT_COMMAND

Я бы хотел, чтобы мое приложение было максимально гибким, а это означает, что я могу легко добавлять больше состояний и настраивать команды, которые можно использовать. Это означает, что я хотел бы избегать использования столбцов if, чтобы знать, что предпринято действие.

Поскольку каждое состояние имеет разные команды, я подумал о создании ENUM с именем State, который объединяет эти разные состояния. Я также создал ENUM с именем Commands, который содержит все возможные команды, которые пользователь мог выполнять при использовании моего приложения.

Моя основная идея была просто:

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

Таким образом, команды State countains и команды countains их метка, которая представляет собой строку префикса команды ("-add")

Но тогда государства могут создавать много команд, и в этом проблема. Так как я не могу и не хочу создавать конструктор для каждого случая в ENUM, я подумал об использовании ArrayList, который бы объединял все команды, делая это:

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

И вот тут-то и возникает мой вопрос. Как сказано в документации, arraylist может взять коллекцию в параметре, чтобы назначить свое внутреннее содержимое.

Могу ли я подсказать, как мне следует структурировать это, чтобы сделать его чистым и простым в управлении?

1 Ответ

2 голосов
/ 06 февраля 2012

Что не так с хранением доступных команд для каждого состояния?В конце концов, вам нужно будет это где-то определить.

Вы можете передать EnumSet доступных команд в конструктор для каждого перечисления State следующим образом:

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

В качестве альтернативы выможно указать для каждой команды, в каком состоянии она будет доступна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...