Pregunta

¿Cómo puedo hacer que una opción acepte solo algunos valores especificados, como en el siguiente ejemplo?

$ 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
¿Fue útil?

Solución

Dado que commons-cli no admite eso directamente, la solución más sencilla es probablemente verificar el valor de una opción cuando la obtenga.

Otros consejos

La otra forma puede ser extender la clase Opción. En el trabajo hemos hecho eso:

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

He querido este tipo de comportamiento antes, y nunca encontré una manera de hacer esto con un método ya provisto. Eso no quiere decir que no existe. Un tipo de manera coja, es agregar el código usted mismo como:

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

Obviamente, habría mejores formas de hacer esto que el largo if / else, posiblemente con un enum , pero eso debería ser todo lo que necesita. Tampoco he compilado esto, pero creo que debería funcionar.

Este ejemplo tampoco hace que " -a " cambio obligatorio, ya que no se especificó en la pregunta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top