Répondre

4

Depuis commons-cli ne supporte pas directement, la La solution la plus simple est probablement de vérifier la valeur d'une option quand vous l'obtenez.

+1

Est-ce encore vrai? – ksl

6

Je voulais ce genre de comportement auparavant, et je n'ai jamais trouvé un moyen de le faire avec une méthode déjà fournie. Cela ne veut pas dire que ça n'existe pas. Une sorte de chemin boiteux, est d'ajouter le code vous-même comme:

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

Il est évident qu'il y aurait plus agréables façons de le faire que le long if/else, peut-être avec un enum, mais cela devrait être tout ce que vous » d besoin. Aussi, je n'ai pas compilé cela, mais je pense que ça devrait marcher.

Cet exemple ne rend pas non plus obligatoire le commutateur "-a", car cela n'a pas été spécifié dans la question.

6

L'autre manière peut être d'étendre la classe Option. Au travail, nous avons fait cela:

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