Java 9中是否可以使用循环模块依赖?

fla*_*kes 17 java java-platform-module-system java-9 java-module module-info

在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;
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*lai 19

不.

文档

有趣的是,模块系统状态Jigsaw快速入门指南都没有解决这个问题.一个来源(由Andy发现)是Alex Buckley的JavaOne演讲(见他在这里解释).最近的一个是开放问题列表,它明确提到了循环依赖:

当模块图最初在编译时,链接时和运行时解析时,当前草稿不允许循环.如果为自动模块添加可读性边缘,或者通过反射,则可以在运行时稍后出现循环.[...]然而,这种约束不是一个记录的要求[...].

理由

循环依赖是坏的,mkay.;)

当两个实体(方法,类,模块,项目......)协作但没有充分解耦时,它们就会出现.对于用户和维护者来说,这种耦合意味着他们不能在不考虑另一个的情况下使用或改进.但这正是模块化试图实现的好处.

从问题列表中,链接如上:

在解决过程中禁止循环的理由是它使模块图更易于推理,它简化了模块系统本身,并且哲学上,循环中涉及的任何模块在逻辑上都是一个模块,所以它们应该被定义为首先.

实验

在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
Run Code Online (Sandbox Code Playgroud)

所以你甚至无法编译模块,更不用说在配置中使用它们了.

  • 我确实认为循环依赖,特别是静态声明的依赖,是因为它们使得更难预测变化的影响. (3认同)