args4j:如果没有给出另一个参数,如何使参数成为必需?

时间:2015-01-27 01:38:04

标签: java command-line-arguments args4j

@Options(name="--in-file")
String fileName;

@Option(name="--table")
String table;

当且仅当--table没有给出值时,我才想要--in-file选项。我该怎么做呢?我知道有一些解决方案(至少我认为)我可以用多个类来做这个,但是在一个简单的程序中,这似乎只有两个参数有点过分。

我知道我也可以在解析完成后手动检查值,但这似乎无法使用args4j。

2 个答案:

答案 0 :(得分:3)

我意识到我可以使用forbids注释选项来实现这一目标。你只需要一个或另一个标签,但为了完整性,我把它放在两者上。

使用forbids

@Options(name="--in-file", forbids{"--table"})
String fileName;

@Option(name="--table", forbids={"--in-file"})
String table;

可以使用depends注释来反向逻辑。


以上为何不完整:

以上只是部分正确:如果您希望在未给出其他选项的情况下需要其中一个选项,则解决方案仍然会失败。必要的部分否决了禁止,所以

@Options(name="--in-file", forbids{"--table"})
String fileName;

@Option(name="--table", required=true, forbids={"--in-file"})
String table;

导致出现逻辑错误,如果我提供--in-file,则会尝试禁止--table,但因为--table是必需的,所以

}。

因此,原始解决方案失败,因为它允许用户既不提供任何选项,即使我没有给出{in}文件`--table' to be required, if and only if。所以,基本上,我原来的问题。

所以

答案 1 :(得分:2)

如上所述,您可以使用forbids

@Options(name="--in-file", forbids{"--table"})
String fileName;

@Option(name="--table", forbids={"--in-file"})
String table;

您可以在课堂上添加检查条件。

if (fileName == null && table == null) {
    throw new CmdLineException();
}

您可以设置与required选项设置时显示的消息相同的异常消息。