编程语言
首页 > 编程语言> > 需求和需要Java 9中的传递语句有什么区别?

需求和需要Java 9中的传递语句有什么区别?

作者:互联网

需求和需要模块声明中的传递模块语句有什么区别?
例如:

module foo {
    requires java.base;
    requires transitive java.compiler;
}

解决方法:

可读性回顾

如果模块棒需要模块饮料,那么模块系统……

>强制饮酒(称为可靠配置)
>允许酒吧阅读饮料(称为readability)
>允许bar中的代码访问drink中导出包中的公共类(称为accessibility)

如果酒吧需要传递饮料,则完全相同 – 饮料必须存在,可以阅读和访问.事实上,对于酒吧和饮料,传递关键字不会改变任何东西.

隐含的可读性

依赖于条形的模块是受传递影响的模块:任何读取条形图的模块也可以读取饮料.换句话说,暗示了饮料的可读性(这就是为什么这被称为implied readability).结果是客户可以访问饮料类型.

因此,如果酒吧需要传递饮料而客户需要酒吧,那么即使客户没有明确依赖饮料,客户也可以阅读饮料.

用例

但为什么?想象一下,你有一个模块,其公共API接受或返回另一个模块的类型.假设bar模块公开返回Drink的实例,这是来自drink模块的接口:

// in module _bar_
public class Bar {

    // `Drink` comes from the module _drink_,
    // which _bar_ requires
    public Drink buyDrink() { /* ... */ }

}

在这个例子中,酒吧使用常规的饮料需求.现在说,客户依赖于bar,所以它的所有代码都可以调用Bar :: buyDrink.但是当它发生时会发生什么?

模块系统抱怨客户不读饮料,因此无法访问饮料.为了解决这个问题,顾客也必须依赖饮料.真是个琐事!你不能马上使用的酒吧是多么无用?

customer requires bar requires drink - but how does customer read drink?

出于这个原因,引入了隐含的可读性:使模块在其自己的公共API中使用另一个模块的类型立即可用,而无需调用者追捕并需要所有涉及的模块.

因此,如果酒吧需要传递饮料,顾客可以开始购买饮料而不需要饮料 – 需要酒吧就足够了.正如它应该.

标签:java-module,java,requires,java-9,module-info
来源: https://codeday.me/bug/20190928/1826960.html