Я пишу код и не могу понять, что происходит с моей ошибкой. Я надеюсь, что кто-то здесь может дать мне несколько ответов. Вот мой код (соответствующая часть):
public class AppData implements Callable<Integer> {
private static AppData appData = new AppData();
private AppData() {
System.out.println("AppData-Constructor");
}
public static AppData getInstance() {
return appData;
}
@Override
public Integer call() throws Exception { // your business logic goes here...
return 0;
}
private boolean _validate;
public boolean validate() {
return _validate;
}
@Option(names = { "--validate" }, description = "", defaultValue = "false", hidden = false, interactive = false, paramLabel = "", required = false, type = boolean.class)
public void set_validate(boolean validate) {
System.out.println("Set Validate: " + validate);
this._validate = validate;
if(validate)
{
System.out.println("\nBeginne Programmvalidierung\n");
Path tmp = null;
try {
// Doing some validation stuff
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Как видите, мой класс - синглтон. Аннотация взята из пиколи, которую я использую для анализа аргументов командной строки. Вызовы System.out
предназначены для отладки. Это поведение, которое я не могу объяснить:
Когда я запускаю свое приложение, например, с «-h» в качестве аргумента, я прекрасно получаю помощь. System.out.println
показывает, что синглтон создан и что set_validate()
вызывается со значением по умолчанию. Но это меняется, когда я использую --validate
в качестве аргумента.
По какой-то причине конструктор и набор по умолчанию вызываются дважды подряд. После этого вызывается set_validate()
с true
(как и должно). Однако кажется, что первый вызов устанавливает переменную экземпляра stati c, а последний вызов со значением true выполняется во втором экземпляре (моя теория). Как следствие, когда я проверяю состояние _validate
с помощью validate()
в моем экземпляре singleton из моего основного метода (в другом классе), я получаю false, поскольку он не был установлен в правильном экземпляре.
Я использовал поисковую систему, чтобы проверить:
- Конструктор не вызывается нигде, кроме экземпляра stati c singleton (как и ожидалось, поскольку он частный).
_validate
нигде не доступен, кроме кода, который я опубликовал. set_validate()
нигде не вызывается. Только Пикокли называет это.
Я не знаю, что проверить дальше. Любые идеи?
С уважением
Thorsten
EDIT: AppData
- это один из нескольких классов, содержащих данные. Все они собраны в один большой класс для Picocli, например:
class Data
{
@AddGroup(...)
AppData appData = AppData.getInstance();
@AddGroup(...)
FooData fooData = FooData.getInstance();
@AddGroup(...)
BarData barData = BarData.getInstance();
}
В моем основном методе он используется так:
Data data = new Data();
CommandLine cmd = new CommandLine(data);
cmd.parseArgs(args);