ответ

4

С Обще-кли не поддерживает, что сразу, Простейшим решением, вероятно, является проверка значения параметра при его получении.

+1

Это все еще так? – ksl

6

Раньше я хотел такого поведения и никогда не сталкивался с этим способом с помощью уже предоставленного метода. Это не значит, что этого не существует. Своего рода хромой образом, чтобы добавить код самостоятельно, такие как:

private void checkSuitableValue(CommandLine line) { 
    if(line.hasOption("a")) { 
     String value = line.getOptionValue("a"); 
     if("foo".equals(value)) { 
      println("OK"); 
     } else if("bar".equals(value)) { 
      println("OK"); 
     } else { 
      println(value + "is not a valid value for -a"); 
      System.exit(1); 
     } 
    } 
} 

Очевидно, что было бы лучше способа сделать это, чем длинный, если/иначе, возможно, с enum, но это должно быть все, что вы» d необходимости. Также я не скомпилировал это, но считаю, что он должен работать.

Этот пример также не делает переключатель «-a» обязательным, так как это не было задано в вопросе.

6

Другим способом может быть расширение класса Option. На работе мы сделали это:

public static class ChoiceOption extends Option { 
     private final String[] choices; 

     public ChoiceOption(
      final String opt, 
      final String longOpt, 
      final boolean hasArg, 
      final String description, 
      final String... choices) throws IllegalArgumentException { 
     super(opt, longOpt, hasArg, description + ' ' + Arrays.toString(choices)); 
     this.choices = choices; 
     } 

     public String getChoiceValue() throws RuntimeException { 
     final String value = super.getValue(); 
     if (value == null) { 
      return value; 
     } 
     if (ArrayUtils.contains(choices, value)) { 
      return value; 
     } 
     throw new RuntimeException(value " + describe(this) + " should be one of " + Arrays.toString(choices)); 
    } 

     @Override 
     public boolean equals(final Object o) { 
     if (this == o) { 
      return true; 
     } else if (o == null || getClass() != o.getClass()) { 
      return false; 
     } 
     return new EqualsBuilder().appendSuper(super.equals(o)) 
       .append(choices, ((ChoiceOption) o).choices) 
       .isEquals(); 
    } 

     @Override 
     public int hashCode() { 
     return new ashCodeBuilder().appendSuper(super.hashCode()).append(choices).toHashCode(); 
     } 
    }