Java Apache CLI OptionBuilder не работает как шаблон Builder

Я хочу сделать что-то вроде

public static final Option job1 =
    OptionBuilder.hasArg(false)
        .isRequired(false)
        .withDescription("description of job1")
        .create(JOB1);

как упоминалось Как указать несколько параметров с помощью apache commons cli?

Я использую зависимость maven как

<dependency>
    <groupId>commons-cli</groupId>
    <artifactId>commons-cli</artifactId>
    <version>1.1</version>
</dependency>

как упоминалось здесь - http://mvnrepository.com/artifact/commons-cli/commons-cli/1.1

Но я не могу, компилятор жалуется

static member org.apache.commons.cli.OptionsBuilder.create() accessed via instance reference

я даже пытался с <version>1.2</version>, но не повезло, я что-то упустил?

Ответы

Ответ 1

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

Нет другого решения, кроме как успокоить компилятор (возможно, отключить предупреждения в вашей среде IDE?) или настроить ваш код следующим образом (непроверенный):

public static final Option job1;

static {
    OptionBuilder.hasArg(false);
    OptionBuilder.isRequired(false)
    OptionBuilder.withDescription("description of job1")
    job1 = OptionBuilder.create(JOB1);
}

Было бы лучше, если класс OptionBuilder был переписан с открытым конструктором без аргументов и только с методами экземпляра, таким образом, как и любой другой строитель. Существует существующий баг в трекер-проблеме commons-cli, подчеркивающий это: https://issues.apache.org/jira/browse/CLI-224

Обновление: мой патч был отправлен в багажник, поэтому новый "правильный" строитель будет доступен в следующей версии commons-cli (v1.3). См. Javadocs здесь.