我想制作一个基于控制台的简单交互式 shell,我可以在其中编写 login
、help
等命令。
我首先想到使用枚举,但后来我不知道如何在没有大量 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/