Java Apache CLI OptionBuilder不能用作Builder模式

day*_*mer 17 java apache command-line-interface

我想做点什么

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

如上所述如何使用apache commons cli指定多个选项?

我正在使用maven依赖

<dependency>
    <groupId>commons-cli</groupId>
    <artifactId>commons-cli</artifactId>
    <version>1.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

如上所述 - 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>,但没有运气,我错过了什么?

Dun*_*nes 29

问题是每个方法OptionBuilder都是静态的,在静态字段上操作并返回单个静态实例.因此,您不需要OptionBuilder执行方法的实例.正如你所做的那样,这并不能很好地满足将呼叫联系在一起的自然愿望.

除了冷却编译器(可能在IDE中禁用警告?)或调整代码如下(未经测试)之外,没有其他解决方案:

public static final Option job1;

static {
    OptionBuilder.hasArg(false);
    OptionBuilder.isRequired(false)
    OptionBuilder.withDescription("description of job1")
    job1 = OptionBuilder.create(JOB1);
}
Run Code Online (Sandbox Code Playgroud)

如果OptionBuilder使用公共无参数构造函数和仅实例方法重写类,那将会更好,因此表现得像其他所有构建器一样.commons-cli问题跟踪器中存在一个现有错误,突出显示:https://issues.apache.org/jira/browse/CLI-224

更新:我的补丁已经提交到trunk,因此下一版commons-cli(v1.3)中将提供一个新的"正确"构建器.在这里查看Javadocs.

  • 您需要的抑制是`@SuppressWarnings("static-access")`,然后您可以使用例如:`Option optionHelp = OptionBuilder.withLongOpt("help").withDescription("print program usage").create("h ");`即使这是一个设计缺陷,每个方法都是静态的 - 正如@Duncan Jones所提到的那样. (6认同)