如何简化这个逻辑/代码?

Tat*_*tat 5 java optimization

我想编写一个接受用户命令的应用程序.user命令以以下格式使用:

命令参数

例如,应用程序可以有"复制","粘贴","删除"命令我认为该程序应该像这样工作:

public static void main(String args[]){

   if(args[0].equalsIgnoreCase("COPY")){
     //handle the copy command

   } else if(args[0].equalsIgnoreCase("PASTE")){
     //handle the copy command


   }/**
    code skipped
     **/


}
Run Code Online (Sandbox Code Playgroud)

所以,它有效,但我认为当我在我的程序中有更多命令时它会变得越来越复杂,而且,阅读也是不同的.简单的逻辑是什么想法?

pol*_*nts 7

根据命令行语法的简单程度,简单enum可能是您的解决方案

public enum Command {
    COPY {
        @Override void execute() {
            System.out.println("Copying...");
        }
    },
    PASTE {
        @Override void execute() {
            System.out.println("Pasting...");
        }       
    },
    DELETE  {
        @Override void execute() {
            System.out.println("Deleting...");          
        }
    },
    ;

    abstract void execute();

    public static void main(String args[]) {
        Command c = Command.valueOf(args[0].toUpperCase());
        c.execute();
    }
}
Run Code Online (Sandbox Code Playgroud)

使用java Command paste,java Command bleh等编译并运行它.您需要将其余部分传递args给生产代码中的枚举.此外,如果找不到具有指定名称的枚举常量,则valueOf抛出IllegalArgumentException.


但是,如果您的语法变得更加复杂,您可能希望使用专门用于命令行解析的库,例如Apache Commons CLI.

  • 这并不比一堆if/elseif好多少.如果您使用枚举,将逻辑移动到枚举方法中会更好,那么您可以简单地使用Command.valueOf(...).execute()而不是所有混乱的检查或切换. (2认同)

Rak*_*yal 7

如果您担心处理命令行参数,那么 Commons CLI就是为此而设的.
浏览CommandLineParser

如果您担心if-else的复杂性,那么您可以使用Command Pattern

public interface Command {
     void exec();
}

public class Copy implements Command {    
     void exec() {
          // your copy Code 
     }
}

public class Paste implements Command {    
     void exec() {
          // your Paste Code 
     }
}


public class Delete implements Command {    
     void exec() {
          // your Delete Code 
 }
Run Code Online (Sandbox Code Playgroud)

- 然后

public static void main(String args[]){
Map commandMap<String,Command> = new HashMap<String,Command>();
commandMap.put("Copy", new Copy());
commandMap.put("Paste", new Paste());
commandMap.put("Delete", new Delete());

if ( commandMap.containsKey(args[0]) ){
commandMap.get(args[0]).exec();

}
}
Run Code Online (Sandbox Code Playgroud)