У меня есть конфиг YAML, который я создаю с помощью этого компоновщика. Строитель берет InputStream, который позволяет мне проверить его с помощью тестовых конфигурационных файлов. Это прекрасно работает, так как SnakeYAML может выяснить, как построить мой объект.
public static MyConfig buildFromYaml(InputStream is) {
MyConfig config = null;
Yaml yaml = new Yaml();
try{
config = yaml.loadAs(is, MyConfig.class);
} catch (Exception e) {
e.printStackTrace();
}
return config;
}
Но в моем приложении, которое оказывается Runner от Cucumber, этот конфиг должен быть встроен в конструктор объекта, который его использует, что происходит с помощью PicoContainer.
public MyStepDefinition(MyConfig myConfig, OtherAppStuff otherAppStuff) {
otherAppStuff.doStuffWith(myConfig);
}
Так что теперь мне нужен конструктор для MyConfig, чтобы MyConfig мог быть сконструирован PicoContainer и затем внедрен в MyStepDefinition.
То, что я придумал это не правильно.
public class MyConfig {
public List<ConfigItem> configItemList;
public MyConfig() {
InputStream is = getClass().getResourceAsStream("/myconfigdefinition.yaml");
MyConfig myConfig = buildFromYaml(is);
this.configItemList = myConfig.configItemList;
}
public static MyConfig buildFromYaml(InputStream is) {
...
}
}
Проблема заключается в бесконечном l oop, где конструктор вызывает buildFromYaml, который снова вызывает конструктор и, таким образом, выполняет циклы.
Итак, чтобы подвести итог, у меня вопрос: как мне написать конструктор, который использует конструктор, который создает конструируемый класс?
Другими словами, как я могу использовать yaml.loadAs(is, MyConfig.class)
в конструкторе MyConfig?