可读性回顾
如果模块bar requires
module drink,然后模块系统...
- 强制存在drink(称为可靠的配置)
- allows bar读书drink(称为可读性 https://blog.codefx.org/java/java-module-system-tutorial/#dependencies-readability)
- 允许代码进入bar访问导出包中的公共类drink(称为可达性 https://blog.codefx.org/java/java-module-system-tutorial/#exports-accessibility)
如果发生完全相同的情况bar requires transitive drink
- drink必须存在、可以读取和访问。事实上,对于bar and drink the transitive
关键字不会改变任何东西。
隐含的可读性
模块根据bar是那些受到影响的人transitive
:任何读取的模块bar还可以阅读drink。换句话说,可读性drink is implied(这就是为什么这被称为隐含的可读性 https://blog.codefx.org/java/implied-readability/)。一个后果就是customer可以访问drink的类型。
So if bar requires transitive drink
and customer requires bar
, then customer可以阅读drink即使它没有明确依赖它。
用例
但为什么?想象一下,您有一个模块,其公共 API 接受或返回另一个模块的类型。让我们说bar模块公开返回实例Drink
,一个接口来自drink module:
// in module _bar_
public class Bar {
// `Drink` comes from the module _drink_,
// which _bar_ requires
public Drink buyDrink() { /* ... */ }
}
在这个例子中,bar使用常规的requires
for drink。现在说,customer依赖于取决于bar,所以它的所有代码都可以调用Bar::buyDrink
。但当它发生时会发生什么呢?
模块系统抱怨说customer不读drink因此无法访问Drink
。为了解决这个问题,customer还必须依赖于drink。多么苦差事啊!不能立即使用的酒吧有多无用?
因此,引入了隐含的可读性:使在其自己的公共 API 中使用另一个模块类型的模块立即可用without要求调用者寻找并要求所有涉及的模块。
So if bar requires transitive drink
, customer无需购买饮料即可开始购买require drink
- require bar
就足够了。正如它应该。