Java 9模块声明中requires and requires transitive的区别

可读性(Readability)

首先要理解模块的可读性

module bar{
    requires drink;
}

bar requires drink意味着:

  • bar模块强制要求存在drink模块,这称为可靠配置。
  • bar模块可以读入drink模块的文件,这称为可读性。
  • bar模块可以访问drink模块的代码,这称为可访问性。
module bar{
    requires transitive drink;
}

bar requires transitive drink和bar requires drink 一样,模块bar对模块drink同样具有依赖存在,可读以及可访问的特性。对于模块bar和模块drink来说,这两种写法没有区别。

隐含可读性(Implied readability)

transitive意为传递的意思。如果其他模块如customer依赖于bar模块,bar模块使用requires transitive引用drink模块,那么customer模块没有 直接声明依赖于drink模块,它对drink模块也是具有可读性的,这个称之为隐含可读性。

即bar requires transitive drink,加上customer requires bar,customer对drink也是可读。如果去掉transitive,则customer对drink不可读。

参考:What's the difference between requires and requires transitive statements in Java 9 module declaration

版权声明:著作权归作者所有。

相关推荐

Angular入口组件(entry component)和声明式组件的区别

Angular的声明式组件和入口组件的区别体现在两者的加载方式不同。声明式组件是通过组件声明的selector加载入口组件(entry component)是通过组件的类型动态加载声明式组件声明式组件会在模板里通过组件声明的selector加载组件。示例@Component({   selector: 'a-cmp',   templat

[译]代码优先的Java 9模块系统教程(二)

服务监控(ServiceMonitor)让我们来想象一个提供娱乐服务的网络,可能是社交网络或者是视频网络。我们希望监控这些服务,以确定系统的健康状况,并且在发生问题时能够发现,而不是客户报告。 这就是ServiceMonitor示例程序所要做的:监视这些服务(另一个惊喜)。幸运的是,服务已经收集了我们想要的数据,ServiceMonitor所需要做的就是定期查询。 不幸的是,并

[译]代码优先的Java 9模块系统教程(一)

Java平台模块系统(JPMS)将模块化带入Java和JVM,并改变了我们在大型应用中的编程方式。 为了充分利用它,我们需要很好地了解,第一步是学习基础知识。 在本教程中,我首先向你展示一个简单的Hello World示例,然后我们用Java 9将一个现有的demo程序模块化。我们将创建模块声明(module-info。java),使用模块路径来编译,打包,

Java 9:List.of()与Arrays.asList()的区别

Java 9新增了List.of的集合工程方法。它与Arrays.asList区别如下:1、Arrays.asList返回的是可变的列表,而List.of返回的是不可变的列表List<Integer> list = Arrays.asList(1, 2, null); list.set(3, 3); //&

理解Java 9的open module(公开模块)

模块化是Java 9新增的一个很重要且影响代码结构的特性。分类根据外部代码在编译时和运行时对模块的访问权限不同分为:常规模块(normal module)和公开模块(open module)。编译时访问比较容易理解,即代码能否显式直接使用模块里的类型,没有权限访问,编译时报错。在运行时访问模块代码是指使用Java里的Core Reflection