Возможно, вы захотите положиться на Map
из Command
с.
Я поясню, что для этого сценария использования Function
или Supplier
или любого другого стандартного функционалаинтерфейс совсем не идиоматичен.Избегайте этого.
Мы можем начать с создания Command
интерфейса
interface Command {
Result execute();
}
Или, если вам нужно принять аргумент
interface Command {
Result execute(final Input input);
}
, который будет иметь требуемыйреализации
class JoinCommand implements Command { ... }
class LeaveCommand implements Command { ... }
class NoopCommand implements Command { ... }
и т. д.
Теперь вам нужно будет сохранить эти определения в структуре данных key
(команда) - value
(реализация).A Map
идеально подходит для этого.
Поскольку определение вашей команды будет String
, тогда
static final Map<String, Command> COMMANDS = new HashMap<>(8);
static {
COMMANDS.put("join", new JoinCommand());
COMMANDS.put("leave", new LeaveCommand());
// And so on
}
Использование довольно простое
final String userMessage = getTheMessageTextSomehow();
final String commandStr = extractCommand(userMessage);
final Command command = COMMANDS.getOrDefault(commandStr, NOOP_COMMAND);
command.execute();
Или, если вам придется принять аргумент
command.execute(yourInput);
Вы также заметите, что я использовал NOOP_COMMAND
, это просто реализация без опций для Command
, чтобы избежать работы с null
.Это может быть, а может и не подходить.
Если вы используете Java 9+
, Map
также можно создать с помощью
Map.of(
"join", new JoinCommand(),
"leave", new LeaveCommand(),
// And so on.
)