有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java创建一个简单的字符串解析器,交互式外壳式

我想基于控制台创建一个简单的交互式shell,在这里我可以编写loginhelp等命令

我首先想到使用enum,但后来我不知道如何在没有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;
            }
        }
    }
}

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


共 (2) 个答案

  1. # 1 楼答案

    想到的一个解决方案是使用设计模式。您可以使用来自用户的输入作为Factory class的鉴别器

    这个工厂类将根据输入生成一个带有“execute”方法的对象。这叫做Command object.

    然后,您可以简单地调用从工厂返回的对象的方法

    不需要switch语句。如果对象为null,那么您就知道用户输入了一个无效选项,并且它将决策逻辑从输入解析器中抽象出来

    希望这会有所帮助:)

  2. # 2 楼答案

    一种简单的方法是使用一个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();
    }
    

    通过实现自己的接口并将其子类化,可以轻松地扩展这种方法以接受参数。如果您知道数据类型,那么最好使用variable arguments,例如void execute(String ... args)