我想基于控制台创建一个简单的交互式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;
}
}
}
}
但我最终看到这可能是做这样事情的最基本的方法,如果我想改变选项的顺序会有问题。我怎么能做一个更简单的解析器?这样它可以工作,但它也会有问题。该程序的使用纯粹是教育性的,不适用于任何严肃的事情。
答案 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,则表示用户输入了无效选项,并将决策逻辑从输入解析器中抽象出来。
希望这会有所帮助:)