这是一个(新手)通用编程问题,而不是特定于Java的挑战。如果它有所作为,它是我的目标语言。
如何在操作期间使用可能具有多种组合的选项来理智地处理程序?
例如,假设我有一个可以按如下方式运行的音乐播放器命令行应用:muzak -s -v -a -i my_music_dir
*-s: shuffle
*-r: replay once
*-v: reverse playlist
*-a: replay all (if -a and -r is active at the same time, -a overrides)
*-i: ignore previously played (same opportunity for file to be replayed)
当我编写方法时,如何跟踪所有可能的选项?例如。对于具有相同起始顺序的列表,muzak -s -v my_music_dir
会为muzak -v -s my_music_dir
生成不同的播放列表。
答案 0 :(得分:2)
如果您不想重新发明轮子,请使用Apache Commons CLI
import org.apache.commons.cli.*;
public class Main {
public static void main(String args[]) {
Options options = new Options();
options.addOption("t", false, "display current time");
CommandLineParser parser = new DefaultParser();
try {
CommandLine cmd = parser.parse(options, args);
if(cmd.hasOption("t")) {
System.out.println("-t is set");
}
}
catch(ParseException exp) {}
}
}
答案 1 :(得分:0)
你可以做一些像这样简单的事情。我采用命令行参数数组,检查它是否包含每个标志并相应地设置一个布尔值。
之后我可以使用我的布尔值使用if
条件处理每个特殊情况。
public static void main(String[] args) {
boolean replay = false;
boolean replayAll = false;
if (Arrays.asList(args).contains("-r")) {
replay = true;
}
if (Arrays.asList(args).contains("-a")) {
replayAll = true;
}
//handle special scenarios at the end
if (replay && replayAll) {
replay = false;
//keep only replayAll true
}
System.out.println(replay);
System.out.println(replayAll);
}
因此,如果您执行java Music -r -a
,结果将为:
repeat: false
repeatAll: true
答案 2 :(得分:0)
我建议你使用开关,因为这种方法很干净并且可以很好地扩展(新选项)
public static void main(String [] args){
选项选项=新选项();
for(String arg: args){ // iterate over all options
if(arg == null) continue; // switch does not like nulls
switch(arg){ // since JDK7 you can switch over Strings
case "-r":
options.setReplay(true); break;
case "-a" :
options.setReplayAll(true); break;
default:
throw new ParseException("Unknown option: "+ arg)
}
}
.... // rest of your code
}
至于其余的代码,我建议你创建一个类选项:
class Options{
boolean replay = false;
boolean replayAll = false;
// getters and setters
// other methods holding flag combinations, like:
public boolean replayNone(){
return !replay && ! replayAll;
}
}