[英]Elegant way to parse console commands in java
因此,我正在制作一個可通過控制台命令運行的應用程序(例如“數據庫新的db_name”)。 什么是最優雅的方式來處理這種事情?
這是我的小原型,基本上只是幾千個開關。 我的意思是它可以工作,但是一旦我想添加一些東西(如傳遞錯誤的參數或傳遞的參數太少)就把所有參數都弄亂了,它就會變得有些混亂,所以我想知道是否有更好的選擇:
public static void main(String[] args) {
while (running) {
Scanner in = new Scanner(System.in);
String cmd = in.nextLine();
parseCmd(cmd);
}
}
private static void parseCmd(String s) {
String[] cmd = s.split(" ");
try {
switch (cmd[0]) {
case "exit":
running = false;
System.out.println("Shutting down...");
break;
case "database":
switch (cmd[1]) {
case "new":
databases.add(new Database(cmd[2]));
break;
default:
System.out.println("Unknown parameter");
break;
}
break;
default:
System.out.println("Unknown command");
break;
}
} catch (Exception ArrayIndexOutOfBoundsException) {
System.out.println("Too few arguments passed");
}
}
我不知道哪種最優雅的方式,但是我做了幾次這樣的事情,並提出了這個解決方案。
為代表命令的“數據庫”創建一個類,一旦找到字符串“數據庫”,便檢索該類的實例並將剩余的參數傳遞給它,以便它可以完成其余的分析。
class DataBaseCommand implements Command {
@Override
public void eval(String[] args) {...}
}
然后,您可以保留以下映射到其名稱的靜態映射:
private static final Map<String, Command> commands = new HashMap<>();
static {
commands.put("database", new DataBaseCommand());
}
switch (cmd[0]) {
case "exit":
running = false;
System.out.println("Shutting down...");
break;
default:
if(commands.contains(cmd[0])) {
commands.get(cmd[0]).eval(cmd);
} else {
System.out.println("Unknown command");
}
break;
}
也許您可以使用一個庫來為您執行很多這些命令解析,例如joptsimple?
我建議使用http://jcommander.org/。它簡單而優雅。 在其中,您可以使用內置注釋,例如,使用jcommander注釋創建類似的類
@Parameters(commandNames = {"test", "Manages dates"})
public class CommandOption {
@Parameter(names = {"-e", "--exit"}, description = "bla bla")
public boolean exit = false;
}
then in main method
public static void main(String... args){
CommandOption opt = new CommandOption();
JCommander jc = new JCommander(opt);
jc.parse(args);
//and now use
System.out.println("value" +opt.exit)
}
然后可以將parmaeters作為java class
-e true傳遞,或者如果可以先創建jar然后再將java -jar 'jar' -e true
-jar'jar'-e true傳遞則更好
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.