关于为多个枚举构建HashMap的Java问题

时间:2018-11-26 10:59:22

标签: java

我正在用Java制作RPG游戏,用于学校作业。在游戏中,我接受用户输入,第一个单词是“命令单词”,因此我创建了一个枚举,将用户输入的字符串转换为枚举常量:

public enum CommandWord
{
    GO("go"), QUIT("quit"), HELP("help"), BACK("back"), LOOK("look"), DROP("drop"), GRAB("grab"), USE("use"), UNKNOWN("?");

    private String commandString;

    /*
     * Initialize with the corresponding command string.
     * @param commandString the command string.
     */
    CommandWord(String commandString) {
        this.commandString = commandString;
    }

    public String toString()
    {
        return commandString;
}

有时第二个单词是“ go”之后的方向,所以我有一个第二个枚举,用于包含更多常量的方向:

UP("up"), DOWN("down"), NORTH("north"), SOUTH("south"), EAST("east"), WEST("west"), UNKNOWN("unknown");

我正在尝试提出一种构建HashMap来存储字符串和相关枚举常量的最佳方法。对于命令字,我有此类:

public class CommandWords
{
    // A mapping between a command word and the CommandWord
    // that is associated with it
    private HashMap<String, CommandWord> validCommands;
    /**
     * Constructor - initialise the command words.
     */
    public CommandWords()
    {
        validCommands = new HashMap<>();
        for (CommandWord command : CommandWord.values()) {
            if(command != CommandWord.UNKNOWN) {
                validCommands.put(command.toString(), command);
            }
        }
    } 

    /**
     * Searches the HashMap of valid commands for the supplied word.
     * @param commandWord The word we're searching for.
     * @return The CommandWord that is mapped to the supplied string commandWord,
     *         or UNKNOWN if it is not in valid command.
     */
    public CommandWord getCommandWord(String commandWord)
    {
        CommandWord command = validCommands.get(commandWord);
        if (command!= null) {
            return command;
        }
        else {
            return CommandWord.UNKNOWN;
        }
    }
}

然后,我可以接受用户输入并搜索命令字,但不能将其重用于方向,项目,字符等。我使用泛型类进行了查看,但无法调用.values()之类的方法。对此,有什么好方法可以使我在不同的枚举上重用CommandWords类吗?

1 个答案:

答案 0 :(得分:0)

我们在Enum上具有 valueOf(String)方法,您不必构建该地图。

对于您的情况,您有一个值,并且知道要转换为哪种Enum类型。因此,只需使用:

CommandWord.valueOf("QUIT");
Items.valueOf("GEM");
etc..

枚举必须在编译时确定。