タイトルは少し複雑かもしれませんが、問題を言語化する他の方法は見当たりませんでした。
私は、いくつかのファイルをロードしてJavaコンポーネントに変換することで特定のコンポーネントを初期化するプロジェクトに取り組んでいます.他のものは、すでにJavaクラスとして存在しているため、ServiceLoaderによってロードされます. これらのオブジェクトはすべてプロバイダーによってマップされ、そこから取得できるようになります。
public class Provider {
private Map<String, Component> map;
public Provider() {
/*
* Load files, transform, and add them to the map
* with keys being their names
*/
/*
* Load Java components and add them to the map
* with keys being their names
*/
}
public Component getComponent(String name) {
return this.map.get(name);
}
}
public interface Component {
public Number execute();
}
いくつかのコンポーネントを Java に直接追加しようとしていますが、それらは以前にプロバイダーにロードされたコンポーネントを使用することを意味する複合的なものです。したがって、プロバイダーから必要なコンポーネントを収集し、それらをコンポジットに追加して、コンポジット自体をプロバイダーに追加する必要があります。
public class Composite implements Component {
private Component component1, component2;
public Composite() {
Provider provider = new Provider();
this.component1 = provider.getComponent("Comp1");
this.component2 = provider.getComponent("Comp2");
}
public Number execute() {
return this.component1.execute() + this.component2.execute();
}
}
コンポジットは、特定の META-INF ファイルに追加するだけでプロバイダに追加できます。次に、ServiceLoader によって処理されます。
私にとって、これはどういうわけか循環依存です。META-INF ファイルで、ServiceLoader によってどの Java クラスを収集する必要があるかを定義する必要があります。これには、新しく実装されたコンポジットも含まれます。ただし、他のすべてのメトリックがプロバイダーによってロードされている限り、そのメトリックを作成することはできません。
その問題を解決するために使用できるパターンまたは別のアプローチはありますか?