Обычно я храню все параметры командной строки в другом классе, например CliArguments. Это позволяет избежать шума в основном классе. Вот что у меня получилось с picocli:
public final class MyApp {
private static final CliArguments cliArgs = new CliArguments();
private MyApp() {}
public static void main (String[] args) {
if (parseArgs (args)) {
new MyApp().execute();
}
}
/* want to avoid this boiler plate */
private static boolean parseArgs(String[] args) {
CommandLine cmd = new CommandLine ( cliArgs );
try {
cmd.parseArgs( args );
if (cmd.isUsageHelpRequested()) {
cmd.usage( cmd.getOut() );
return false;
}
else if ( cmd.isVersionHelpRequested() ) {
cmd.printVersionHelp (cmd.getOut());
return false;
}
logger.info("{}", cliArgs);
return true;
}
catch ( ParameterException ex ) {
logger.error ("Failure to parse : {}", ex);
return false;
}
}
private void execute() {
// execution logic
}
}
Как избежать шаблонного метода, pargeArgs(String[])
? Технически класс CliArguments не должен реализовывать Callable или Runnable. Я могу сделать MyApp Callable или Runnable. но для CommandLine new MyApp() не является командой, а new CliArguments().
Если я хочу сделать что-то вроде этого:
final int exitCode = new CommandLine(new MyApp()).execute(args);
if (0 != exitCode) {
logger.error("Failed to parse");
System.exit(exitCode);
}
как перенести всю спецификацию @Option
в другой класс, CliArguments, сохраняя при этом управление выполнением в MyApp?
Я уверен, что мне чего-то не хватает прямо вперед.