Я пишу код и не могу понять, что происходит с моей ошибкой. Я надеюсь, что кто-то здесь может дать мне некоторые ответы. Вот мой код (соответствующая часть):
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();
}
}
}
}
Как видите, мой класс — синглтон. Аннотация взята из picoli, которую я использую для разбора аргументов командной строки. System.out
-вызовы предназначены для отладки. Это поведение, которое я не могу объяснить:
Когда я запускаю свое приложение, например. "-h" в качестве аргумента, я отлично печатаю справку. System.out.println
показывает, что синглтон создан и что set_validate()
вызывается со значением по умолчанию. Но это меняется, когда я использую --validate
в качестве аргумента.
По какой-то причине конструктор и набор по умолчанию вызываются два раза подряд. После этого set_validate()
вызывается с true
(как и должно быть). Однако кажется, что первый вызов задает статическую переменную экземпляра, а последний вызов с истинным значением выполняется во втором экземпляре (моя теория). Как следствие, когда я проверяю состояние _validate
с помощью validate()
в моем экземпляре singleton из моего основного метода (в другом классе), я получаю false, поскольку оно не было установлено в правильном экземпляре.
Я использовал поисковую систему, чтобы проверить:
- Конструктор не вызывается нигде, кроме экземпляра статического синглтона (как и ожидалось, поскольку он приватный).
_validate
нигде не доступен, кроме кода, который я разместил.set_validate()
нигде не вызывается. Только Пикокли называет это.
Я не знаю, что проверить дальше. Любые идеи?
С уважением
Торстен
РЕДАКТИРОВАТЬ: 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);