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 ofaction()
,命令类中还有什么其他内容?看起来您的设计被破坏了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");