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