在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;
}
答案 0 :(得分:16)
不。
有趣的是,State of the Module System和Jigsaw Quick Start Guide都没有解决这个问题。一个来源(由Andy找到)是Alex Buckley的JavaOne演讲(见他解释here)。最近的一个是list of open issues,它明确提到了cyclic dependencies:
当模块图最初在编译时,链接时和运行时解析时,当前草稿不允许循环。如果为自动模块添加可读性边缘,或者通过反射,则可以在运行时稍后出现循环。 [...]然而,这种约束不是一个记录的要求[...]。
循环依赖很糟糕,mkay。 ;)
当两个实体(方法,类,模块,项目......)协作但没有充分解耦时,它们就会出现。对于用户和维护者而言,这种耦合意味着他们不能在不考虑其他情况下使用或改进。但这正是模块化试图实现的好处。
从上面链接的问题列表中
在解决过程中禁止循环的理由是它使模块图更易于推理,它简化了模块系统本身,并且哲学上,循环中涉及的任何模块在逻辑上都是一个模块,所以它们应该是首先是这样定义的。
我创建了一个包含两个周期的小demo project on GitHub(对:两个 - >一个 - >两个; 三个:三个 - >两个 - >一个 - >三个)。尝试快速入门指南中显示的multi-module compilation,结果如下:
./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
所以你甚至无法编译模块,更不用说在配置中使用它们了。
答案 1 :(得分:-2)
除了自动模块模块外,不会出现问题。 只允许传递依赖,传递依赖永远不会循环。