0

タイトルは少し複雑かもしれませんが、問題を言語化する他の方法は見当たりませんでした。

私は、いくつかのファイルをロードして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 クラスを収集する必要があるかを定義する必要があります。これには、新しく実装されたコンポジットも含まれます。ただし、他のすべてのメトリックがプロバイダーによってロードされている限り、そのメトリックを作成することはできません。

その問題を解決するために使用できるパターンまたは別のアプローチはありますか?

4

1 に答える 1