19

Java 9 では、循環モジュールは許可されますか? いいえの場合、その理由は何ですか?

module com.foo.bar {
    requires com.foo.baz;
    exports com.foo.bar.fizz;
}

module com.foo.baz {
    requires com.foo.bar;
    exports com.foo.baz.buzz;
}
4

2 に答える 2

21

いいえ。

ドキュメンテーション

興味深いことに、State of the Module SystemJigsaw クイック スタート ガイドも、この問題に対処していません。1 つの情報源 ( Andyによって発見された) は、Alex Buckley による JavaOne の講演です (彼の説明はこちらをご覧ください)。より最近のものは、オープンな問題のリストであり、明示的に循環依存関係に言及しています:

現在のドラフトでは、コンパイル時、リンク時、および実行時にモジュール グラフが最初に解決されるときの循環が許可されていません。自動モジュールに読みやすさのエッジが追加された場合、またはリフレクションを介して、実行時に後でサイクルが発生する可能性があります。[...] ただし、この制約は文書化された要件ではありません [...]。

正当化

循環的な依存関係は悪いものです。;)

それらは、2 つのエンティティ (メソッド、クラス、モジュール、プロジェクトなど) が連携するが、十分に切り離されていない場合に出現します。ユーザーとメンテナーにとって、この結合は、一方を考慮せずに一方を使用または改善できないことを意味します。しかし、これこそまさにモジュール化が達成しようとしている利点です。

上にリンクされている問題リストから:

解決中にサイクルを許可しない理由は、モジュール グラフを推論しやすくし、モジュール システム自体を単純化し、哲学的には、サイクルに含まれるモジュールはいずれにせよ論理的には 1 つのモジュールであるため、そのように定義する必要があるためです。そもそも。

実験

2 つのサイクル (ペア: 2 -> 1 -> 2;トリプル: 3 -> 2 -> 1 -> 3)を含む小さなデモ プロジェクトを GitHubで作成しました。クイック スタート ガイドに示されているようにマルチモジュール コンパイルを試すと、次の結果が得られます。

./compile.sh
 > creating clean directories
 > compiling and packaging cycle "pair"
src/org.codefx.demo.cyclic.pair.one/module-info.java:2: error: cyclic dependence involving org.codefx.demo.cyclic.pair.two
        requires org.codefx.demo.cyclic.pair.two;
                                            ^
1 error
 > compiling and packaging cycle "triple"
src/org.codefx.demo.cyclic.triple.three/module-info.java:2: error: cyclic dependence involving org.codefx.demo.cyclic.triple.two
        requires org.codefx.demo.cyclic.triple.two;
                                              ^
1 error

したがって、構成でモジュールを使用することはもちろん、モジュールをコンパイルすることさえできません。

于 2016-02-29T07:19:02.767 に答える