Java 8 使用这么多新语句可以吗?

Java 8 使用这么多新语句可以吗?,java-8,Java 8,我有以下代码来处理我的命令: public class CommandHandler { public static final CommandParser parser = new CommandParser(); public static HashMap<String, Command> commands = new HashMap<>(); public static void handleCommand(CommandParser.C

我有以下代码来处理我的命令:

public class CommandHandler {

    public static final CommandParser parser = new CommandParser();
    public static HashMap<String, Command> commands = new HashMap<>();

    public static void handleCommand(CommandParser.CommandContainer cmd) {

        if (commands.containsKey(cmd.invoke)) {         
            commands.get(cmd.invoke).action(cmd.event, cmd.args);
            commands.get(cmd.invoke).postAction(cmd.event, cmd.args);
        }
        /* else
            System.err.println("CMD NOT EXIST!"); */
    }
}

public static HashMap<String, Command> commands = new HashMap<>();

private static void addCommands() {
    commands.put(new cmdConfig().getCommand(), new cmdConfig());
    commands.put(new cmdHelp().getCommand(), new cmdHelp());
    commands.put(new cmdPing().getCommand(), new cmdPing());
}
此外,我也使用此代码:

String input = "random";

if (new cmdPing().getCommand().equals(input)) {
    new cmdPing().help();
}
else if (new cmdConfig().getCommand().equals(input)) {
    new cmdConfig().help();
}
else {
    printError(input + " is not a valid command");
}

我想知道,当我使用
命令时,是否可以使用许多新语句。将
if()
语句放入其中。

删除接口和所有实现类

相反,使用
命令
帮助
final
字段,将
命令
设为
枚举
,作为帮助的获取工具,并使用
操作()
方法

命令名不需要getter,因为只有类本身需要使用它


如果需要获取给定字符串的枚举实例,请使用所有枚举都具有的
valueOf()
方法。

删除接口和所有实现类

相反,使用
命令
帮助
final
字段,将
命令
设为
枚举
,作为帮助的获取工具,并使用
操作()
方法

命令名不需要getter,因为只有类本身需要使用它


如果需要获取给定字符串的枚举实例,请使用所有枚举都具有的
valueOf()
方法。

创建一个包含所有命令的
HashMap commands
,然后不使用该映射查找命令,这非常奇怪,这正是创建此类映射的目的

public static final List<Command> ALL_COMMANDS
    = Collections.unmodifiableList(Arrays.asList(
        new cmdConfig(), new cmdHelp(), new cmdPing(), …
    ));
public static Map<String, Command> ALL_COMMANDS_BY_NAME
    = ALL_COMMANDS.stream()
                  .collect(Collectors.toMap(Command::getCommand, Function.identity()));

如果各个命令的实际实现相当简短,您可以考虑在一个<代码> EnUM <代码>中实现所有这些命令:实现<代码>命令< /代码>。然后,由于生成的

values()
方法返回所有常量的数组,您可以免费获得线性
ALL_命令列表。应用程序逻辑的其余部分保持不变。

非常奇怪的是,您正在创建一个包含所有命令的
HashMap commands
,而不使用该映射来查找命令,这正是创建这样一个映射的目的

public static final List<Command> ALL_COMMANDS
    = Collections.unmodifiableList(Arrays.asList(
        new cmdConfig(), new cmdHelp(), new cmdPing(), …
    ));
public static Map<String, Command> ALL_COMMANDS_BY_NAME
    = ALL_COMMANDS.stream()
                  .collect(Collectors.toMap(Command::getCommand, Function.identity()));

如果各个命令的实际实现相当简短,您可以考虑在一个<代码> EnUM <代码>中实现所有这些命令:实现<代码>命令< /代码>。然后,由于生成的

values()
方法返回所有常量的数组,您可以免费获得线性
ALL_命令列表。应用程序逻辑的其余部分保持不变。

除了两个访问器方法返回的字符串和(我假设)常见的
action()
)impl之外,命令类中还有什么内容?看起来您的设计被破坏了
put(new cmdConfig().getCommand(),new cmdConfig())
至少应该像
c=new cmdConfig()那样编写;放置(c.getCommand(),c)
。看起来您创建许多对象只是为了得到一个常量字符串,在类中创建一个最终的静态字段…感谢您的帮助!除了两个访问器方法返回的字符串和(我假设)通用的impl of
action()
,命令类中还有什么其他内容?看起来您的设计被破坏了
put(new cmdConfig().getCommand(),new cmdConfig())
至少应该像
c=new cmdConfig()那样编写;放置(c.getCommand(),c)
。看起来您创建许多对象只是为了得到一个常量字符串,在类中创建一个最终的静态字段…感谢您的帮助!我忘了添加CommandHandler类,您现在可以检查它了。在hashmap中我需要一个字符串键,所以enum对我不起作用。而且,我刚刚尝试了它,它工作得非常好。这正是我所需要的。如果您在我的代码中遇到其他错误,请告诉我。非常感谢。我忘了添加CommandHandler类,您现在可以检查它了。在hashmap中我需要一个字符串键,所以enum对我不起作用。而且,我刚刚尝试了它,它工作得非常好。这正是我所需要的。如果您在我的代码中遇到其他错误,请告诉我。非常感谢。谢谢你的帮助!谢谢你的帮助!
String input = "random";
Command cmd = ALL_COMMANDS_BY_NAME.get(input);
if(cmd != null) cmd.help();
else printError(input + " is not a valid command");