创建一个简单的String解析器,类似于Interactive Shell

时间:2013-03-01 22:53:55

标签: java

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

我首先考虑使用Enums,但后来我不知道如何在没有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 个答案:

答案 0 :(得分:1)

一种简单的方法是使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)

答案 1 :(得分:0)

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

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

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

无需切换声明。如果对象为null,则表示用户输入了无效选项,并将决策逻辑从输入解析器中抽象出来。

希望这会有所帮助:)