这个问题是关于处理 Java 命令行应用程序中的连续用户输入。
在Main
中,我有以下代码:
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()) {
String line = sc.nextLine().replaceAll("\n", "");
// return pressed
if (line.length() == 0) {
continue;
}
// split line into arguments
String[] args1 = line.split(" ");
// process arguments
if (args1.length > 0) {
if (args1[0].equalsIgnoreCase("q")) {
System.exit(0);
} else if (args1[0].equalsIgnoreCase("someInput")) {
// Put stuff here
} else {
System.out.println("exiting");
System.exit(0);
}
}
}
正如您所知,这是为了处理来自命令行的连续输入。如果输入是q
,程序就会退出,而当输入是someInput
时,程序就会执行其他操作。这个程序本质上是一个状态机。
但是,这个程序很快就会变得困惑,因为它将演变成一堆 if 语句和 boolean 标志来进入 if 语句。
例如,当我编写当前的 CLI 应用程序时,它变成了 15 多个 if 语句,在可读性和可维护性方面完全是一团糟。
我的问题是 - 在不使用困惑的 if 语句的情况下处理连续条件用户输入的更好方法是什么,以便它更具可读性和可维护性?
注意:输入是非离散的,这意味着它不是简单的字符串匹配。
最佳答案
假设您的输入以命令 token 开头,您可以创建命令界面并构建 map 查找。例如:
interface Command {
void invoke(String input);
}
然后将您的 if 语句转换为 Command 实现,例如:
public class CookCommand impements Command {
void invoke(String input) {
..
}
}
public class ShowerCommand implements Command {
void invoke(String input) {
..
}
}
然后使用这些命令对象构建 map :
Map<String, Command> commands = new HashMap<>();
commands.put("shower", new ShowerCommand());
commands.put("cook", new CookCommand());
然后在您的 eval 循环中只需查找此映射即可获取关联的 Command 对象并调用它
Command cmd = commands.get(commandName);
if(cmd != null) cmd.invoke(input);
else System.err.println("Unknown command " + cmd);
关于java - 在 Java 的 CLI 应用程序中处理连续的用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30677981/