java - 创建一个简单的字符串解析器,类似交互式 Shell

标签 java

我想制作一个基于控制台的简单交互式 shell,我可以在其中编写 loginhelp 等命令。

我首先想到使用枚举,但后来我不知道如何在没有大量 if-else 语句的情况下巧妙地实现它们,所以我决定采用数组方法并想出了这个:

public class Parser {
    private static String[] opts = new String[] {"opt0", "opt1", "opt2", "opt3" ... }

    public void parse(String text) {
        for(int i = 0; i < opts.length; i++) {
            if(text.matches(opts[i]) {
                switch(i) {
                    case 0:
                        // Do something

                    case 1:
                        // Do something-something

                    case 2:
                        // Do something else
                }

             return;
            }
        }
    }
}

但我最终发现这可能是做类似事情的最基本的方法,如果我想改变选项的顺序就会出现问题。我怎样才能制作一个更简单的解析器?这样虽然可以工作,但是也会出现问题。该程序的使用纯粹是为了教育目的,并非用于任何严肃的事情。

最佳答案

一种简单的方法是使用一个HashMap,其键等于命令文本,值是处理该命令的类的实例。假设命令处理程序类不接受参数(但您可以轻松扩展它),您可以只使用 Runnable 实例。

示例代码:

Runnable helpHandler = new Runnable() {
    public void run(){
       // handle the command
    } 
}

// Define all your command handlers

HashMap<String, Runnable> commandsMap = new HashMap<>(); // Java 7 syntax

commandsMap.put("help",helpHandler);
// Add all your command handlers instances

String cmd; // read the user input
Runnable handler;
if((handler = commandsMap.get(cmd)) != null) {
  handler.run();
}

您可以通过实现自己的接口(interface)并将其子类化来轻松扩展此方法以接受参数。如果您知道数据类型,那么最好使用变量参数 voidexecute(String ... args)

关于java - 创建一个简单的字符串解析器,类似交互式 Shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15168214/

相关文章:

java - 在android上实现自动颜色(photoshop工具)

java - 如何使用 JPA 2 和 HBN maven 插件创建 hibernate 友好的 MySQL 数据库字段?

java - 使用 Java 运行 SET 命令

java - 使用 Java 缩放大图像

java - 从抽象类继承

java - Mac 编程到 Android 编程

Java:如何创建需要扩展类并实现接口(interface)的数据类型的通用类?

java - 无法从 java 文件 Intellij id 导入 proto 文件

java - Android OnClickListener 中,通过方法部分更新图像

java - JOGL 和 Swing 的问题