Java 命令行程序中的处理选项

Java 命令行程序中的处理选项,java,Java,这更多的是一个(新手)一般编程问题,而不是java特有的挑战。这是我的目标语言,如果它起作用的话 你如何理智地处理一个在运行过程中可能有多种组合选项的程序 例如,假设我有一个音乐播放器命令行应用程序,可以按如下方式运行:muzak-s-v-a-I my_music_dir *-s:洗牌 *-r:重播一次 *-v:反向播放列表 *-a:全部重播(如果-a和-r同时处于活动状态,-a覆盖) *-i:忽略以前播放的(与重放文件的机会相同) 在编写方法时,如何跟踪所有可能的选项?例如,muzak-s

这更多的是一个(新手)一般编程问题,而不是java特有的挑战。这是我的目标语言,如果它起作用的话

你如何理智地处理一个在运行过程中可能有多种组合选项的程序

例如,假设我有一个音乐播放器命令行应用程序,可以按如下方式运行:
muzak-s-v-a-I my_music_dir


*-s:洗牌
*-r:重播一次
*-v:反向播放列表
*-a:全部重播(如果-a和-r同时处于活动状态,-a覆盖)
*-i:忽略以前播放的(与重放文件的机会相同)


在编写方法时,如何跟踪所有可能的选项?例如,
muzak-s-v my_music_dir
产生的播放列表与
muzak-v-s my_music_dir
产生的播放列表不同,播放顺序相同。

如果不想重新发明方向盘,请使用


你可以做一些相当简单的事情。我将获取命令行参数数组,检查它是否包含每个标志,并相应地设置一个布尔值

之后,我可以使用布尔运算,使用
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);

}
因此,如果执行
javamusic-r-a
,结果将是:

重复:false


repeatAll:true

我建议您使用switch,因为这种方法很干净,并且可以很好地扩展(新选项)

公共静态void main(字符串[]args){

选项=新选项()

至于其余的代码,我建议您创建一个类选项:

class Options{

  boolean replay = false;
  boolean replayAll = false;

  // getters and setters

  // other methods holding flag combinations, like:
  public boolean replayNone(){
   return !replay && ! replayAll;
  }
}
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;
  }
}