Antwort

4

Da commons-cli nicht unterstützt, dass direkt die einfachste Lösung ist wahrscheinlich, den Wert einer Option zu überprüfen, wenn Sie es erhalten.

+1

Ist das immer noch wahr? – ksl

6

Ich wollte diese Art von Verhalten vor, und stieß nie auf eine Möglichkeit, dies mit einer bereits bereitgestellten Methode zu tun. Das heißt nicht, dass es nicht existiert. Eine Art lahmer Weise ist den Code selbst, wie hinzuzufügen:

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); 
     } 
    } 
} 

Natürlich wäre es schöne Wege, dies zu tun, als die lange, wenn/sonst, möglicherweise mit einem enum, aber das sollte alles sein, das Sie‘ d brauchen. Auch das habe ich nicht zusammengestellt, aber ich denke, es sollte funktionieren.

In diesem Beispiel wird auch der Schalter "-a" nicht obligatorisch, da dies in der Frage nicht angegeben wurde.

6

Der andere Weg kann sein, die Option-Klasse zu erweitern. Bei der Arbeit haben wir das gemacht:

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(); 
     } 
    }