【发布时间】:2017-02-17 09:56:00
【问题描述】:
我正在编写一个简单的游戏,其中我使用枚举 CommandManager 来存储有关可能的命令以及每个命令的作用的信息。此枚举的主要目的是能够打印出可用命令的菜单,以及用于检查输入并执行与该输入相关的操作。我的问题在于第二次使用,我使用 switch 语句根据用户的输入来确定用户想要做什么。尝试使用 Enum 的属性(通过 getter 方法)作为案例标签时出现编译错误。提供的错误消息是case expressions must be constant expressions。鉴于CommandManager 的属性被声明为最终属性,我是否认为枚举的属性根本不能在 switch 语句中使用?如果是这样,为什么?
下面包含的代码的简化版本,以防我的错误。
方法代码:
void interpretInput() {
String command = input.getInput();
if (command.length() == 2) {
switch (command) {
case CommandManager.MAINMENU.getCommand(): goToMainMenu();
break;
case CommandManager.NEWGAME.getCommand(): startNewGame();
break;
case CommandManager.LISTGAMES.getCommand(): listSavedGames();
break;
case CommandManager.EXITGAME.getCommand(): exitGame();
break;
case CommandManager.HELPMENU.getCommand(): listAllCommands();
break;
}
}
}
枚举代码:
public enum CommandManager {
NEWGAME("!n", "New game"),
MAINMENU("!m", "Go to main menu"),
EXITGAME("!q", "Exit Battleships"),
LISTGAMES("!g", "List saved games"),
HELPMENU("!h", "Open help menu"),
LOADGAME("!l", "Load a new game"),
SAVEGAME("!s", "Save current game");
private final String command;
private final String menuOption;
CommandManager(String aCommand, String anOption) {
command = aCommand;
menuOption = anOption;
}
String getCommand() {
return command;
}
String getMenuOption() {
return menuOption;
}
}
【问题讨论】:
-
因为它们不是编译时间常数。
-
你可以在 switch 语句中使用枚举,但你不能。您正在使用字符串,但正如错误消息所述,标签必须是常量。
-
从输入中读取
String command后,得到对应的枚举值,然后直接开启枚举就好了。 -
如果您切换到 String 值,您并没有很好地使用
enum。如果这是您的目标,则有许多public static final String常量。您将能够对它们进行切换。 -
如果您正在编写
enum类,那么在其上使用switch通常是错误的,因为您可以为枚举常量编写特定于常量的方法,这些方法几乎在每种情况下都提供了更多对象面向、健壮且更易于维护的解决方案。实际上,几乎在每种情况下,您在代码中写入switch后的第一个反应应该是问自己“有没有一种方法可以让我无法切换?”
标签: java enums switch-statement