簡體   English   中英

在Java中解析控制台命令的優雅方法

[英]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)
    }

然后可以將parmae​​ters作為java class -e true傳遞,或者如果可以先創建jar然后再將java -jar 'jar' -e true -jar'jar'-e true傳遞則更好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM