Как написать конструктор, который вызывает конструктор, который строит сам? - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть конфиг 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...