0

このビルダーで構築する 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;
}

しかし、たまたま Cucumber Runner である私のアプリケーションでは、この構成は、それを使用するオブジェクトに注入されたコンストラクターである必要があり、たまたま PicoContainer によって行われます。

public MyStepDefinition(MyConfig myConfig, OtherAppStuff otherAppStuff) {
  otherAppStuff.doStuffWith(myConfig);
}

そこで、PicoContainer によって MyConfig を構築し、MyStepDefinition に注入できるように、MyConfig のコンストラクターが必要です。

私が思いついたのはこれです、これは正しくありません。

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) {
       ...
    }
}

問題は、コンストラクターがコンストラクターを再度呼び出してループする buildFromYaml を呼び出す無限ループです。

要約すると、私の質問は、構築中のクラスを構築するビルダーを使用するコンストラクターをどのように作成すればよいかということです。つまり、 MyConfig のコンストラクターで
どのように使用するのですか?yaml.loadAs(is, MyConfig.class)

4

0 に答える 0