1

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

我首先想到了使用 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;
            }
        }
    }
}

但我最终发现这可能是做这种事情的最基本的方法,如果我想改变选项的顺序会出现问题。我怎样才能制作一个更简单的解析器?这样它会起作用,但它也会说问题。该程序的使用纯粹是教育性的,不用于任何严肃的事情。

4

2 回答 2

1

一种简单的方法是让 aHashMap的键等于命令文本,值是处理此命令的类的实例。假设命令处理程序类不接受参数(但您可以轻松扩展它),您可以只使用一个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)

于 2013-03-01T23:44:33.943 回答
0

想到的一种解决方案实际上是使用设计模式。您可以使用来自用户的输入作为工厂类的鉴别器。

这个工厂类将根据输入生成一个带有“执行”方法的对象。这称为命令对象。

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

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

希望这会有所帮助:)

于 2013-03-01T23:09:13.843 回答