Java Apache CLI OptionBuilder 不作为 Builder 模式工作

2022-09-03 00:45:12

我想做这样的事情

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

问题在于,中的每个方法都是静态的,对静态字段进行操作并返回单个静态实例。因此,您不需要 实例来执行这些方法。这与将呼叫链接在一起的自然愿望不能很好地结合在一起,就像你所做的那样。OptionBuilderOptionBuilder

除了使编译器平静下来(也许在IDE中禁用警告?)或按如下方式调整代码(未经测试)之外,没有其他解决方案:

public static final Option job1;

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

如果使用公共无参数构造函数和仅实例方法重写该类会更好,从而像其他所有构建器一样运行。commons-cli issue tracker中有一个现成的错误,强调了这一点:https://issues.apache.org/jira/browse/CLI-224OptionBuilder

更新:我的补丁已经提交到主干,所以一个新的“适当”的构建器将在commons-cli的下一个版本(v1.3)中可用。请参阅此处的 Javadocs


答案 2