在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;
}发布于 2016-02-29 07:19:02
不是的。
文档
有趣的是,模块系统的状态和拼图快速启动指南都没有解决这个问题。其中一个来源(由安迪发现)是亚历克斯·巴克利( Alex )的一篇JavaOne演讲(参见他解释,这里)。最近的一个是未决问题清单,它显式地提到了循环相依
当模块图最初在编译时、链接时和运行时被解析时,当前的草案不允许循环。如果为自动模块添加了可读性边缘,或者通过反射,则在运行时可能会出现循环。..。然而,这一约束并不是一项记录在案的要求。
对齐
循环依赖是不好的,mkay。;)
当两个实体(方法、类、模块、项目、.)出现时,它们就会出现。协作,但没有充分解耦。对于用户和维护人员来说,这种耦合意味着他们不能在不考虑另一个因素的情况下使用或改进其中一个。但这正是模块化正在努力实现的好处。
来自上述问题清单,链接如下:
在解析过程中拒绝循环的理由是,它使模块图更易于推理,简化了模块系统本身,并且,从哲学上讲,任何涉及循环的模块在逻辑上都是一个模块,因此首先应该将它们定义为模块。
实验
我创建了一个包含两个循环的小基于GitHub的演示项目 (对:两个->一个-> 2;三元:三个->两个->一个-> 3)。如快速启动指南所示,尝试多模块编译的结果如下:
./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因此,您甚至无法编译模块,更不用说在配置中使用它们了。
发布于 2017-07-20 08:28:24
除非模块是自动模块,否则不会出现问题。只允许传递依赖项,和传递依赖项从不循环。
https://stackoverflow.com/questions/35688995
复制相似问题