Frage

Wie kann ich eine Option machen akzeptieren nur einige angegebenen Werte wie im folgenden Beispiel:

$ java -jar Mumu.jar -a foo
OK
$ java -jar Mumu.jar -a bar
OK
$ java -jar Mumu.jar -a foobar
foobar is not a valid value for -a
War es hilfreich?

Lösung

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

Andere Tipps

Die andere Art und Weise kann die Option Klasse 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();
      }
  }

ich diese Art von Verhalten haben, bevor wollte, und kam nie über einen Weg, dies mit einem bereits vorgesehenen Verfahren zu tun. Das ist nicht zu sagen, 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, was Sie brauchen würden sein. Ich habe auch das nicht kompiliert, aber ich denke, es sollte funktionieren.

In diesem Beispiel wird auch nicht macht die „-a“ zwingend wechseln, da diese nicht in der Frage angegeben wurden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top