java - 在 Java 的 CLI 应用程序中处理连续的用户输入

标签 java

这个问题是关于处理 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/

相关文章:

java - 在我的太空入侵者类型游戏中放置重新启动按钮

java - 在应用程序范围内共享一个对象

java - Restful 系统调用类字段成员与后端类字段类型不同

java - 将用户输入数据添加到 ArrayList 并使用自定义 Tablemodel 将其显示到 Jtable 中

java - 如何使用 Groovy stub Mockito 中的重载方法?

java - 如何使用java nio在网络编程中设计和实现 "timeout Timer"

java - 在 OpenImaj 中查找 Caltech101 类和记录

java - 具有多个 where 子句的选择查询

java - 基于 Java 的 GUI 用于搜索 MySQL 数据库时出现 "Stored PROCEDURE does not exists"错误

java - 将表达式 'spa.amount' 设置为值 '[Ljava.lang.String;@10dd65e' 时出错)