我想编写一个接受用户命令的应用程序。 user命令以这种格式使用:
command -parameter
例如,应用程序可以有“复制”,“粘贴”,“删除”命令 我认为该程序应该像这样工作:
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
**/
}
所以,它有效,但我认为当我在我的程序中有更多命令时它会变得越来越复杂,而且,阅读也是不同的。任何简单逻辑的想法?
答案 0 :(得分: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();
}
}
使用java Command paste
,java Command bleh
等编译并运行此功能。您需要将剩余的args
传递给生产代码中的枚举。此外,如果找不到具有指定名称的枚举常量,valueOf
将抛出IllegalArgumentException
。
但是,如果您的语法变得更加复杂,您可能希望使用专门用于命令行解析的库,例如: Apache Commons CLI
答案 1 :(得分:7)
如果您担心处理命令行参数,那么Commons CLI就是为了这个。
浏览CommandLineParser
如果您担心 if-else 的复杂性,那么您可以使用命令模式
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
}
- 那么
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();
}
}
答案 2 :(得分:3)
使用库来保持命令行参数解析的混乱,例如args4j。
答案 3 :(得分:1)
当我看到很多if / then / else代码时,我立刻认为多态是一种可能的解决方案。
命令界面和地图将是解决此问题的好方法。如果我用Java编写它,它可能看起来像这样:
public interface Command<T, V>
{
V execute(T parameter) throws Exception;
}
如果您的操作是多线程的,则可以简单地为不返回值的命令重用Runnable接口,并且Callable&lt; T&gt;对于那些。
在任何一种情况下,现在你的if / then / else构造都是一个Map,其中键是名称,值是Command对象。您通过提供名称密钥来查找命令。您可以通过编写Command接口的新实现并将其添加到Map来添加新命令。初始化Map是您在启动时执行的操作。您甚至可以将其外部化为配置,这样您就不必修改代码来添加新代码(开放/封闭原则)。
答案 4 :(得分:0)
有许多库可以处理这种情况,而不是写下所有代码。