新的Java 9功能介绍
第9版给Java定义模块的可能性。一个模块是一个命名的,自描述的程序组件,由一个或多个包(和数据)组成。模块可以定义如清单1所示。
模块 de module .a { exports de。module .a.paket.x;}模块 de module .b { exports de。module .a.paket.y; 出口德 module .a.paket.z;}模块 de module .c { requires de。模块 .a 需要 de 模块 .b}
该接口定义指示模块向外部世界提供哪些包(使用关键字exports)以及外部需要哪些模块(需要关键字)。注意:这不是前一句中的错字; 一个模块导出包,但需要模块。这可能会令人困惑,因为软件包和模块通常具有相同或非常相似的名称。未明确导出的模块的所有软件包只能在模块中使用。如果您尝试从模块外部访问它们,则会发生编译器错误。
使用模块化JAR作为模块
现在我们已经看到了如何声明一个模块,让我们回答另一个问题:我们在哪里编写模块声明?该约定表示您在名为module-info.java的源代码文件中声明它,并将其放在模块的文件层次结构的根目录下。然后,编译器将其转换为文件module-info.class。名称“module-info”包含连字符,因为它是一个无效的类名。这样,现有的代码就不会被损坏。然后将Java文件称为模块声明和类文件模块描述符。
如果您以这种方式声明了一个模块,则可以从中创建一个模块化的JAR。它的结构就像一个常规的JAR文件,区别在于它的根目录下有一个module-info.class文件。这样的模块化JAR可以用作模块。由于向下兼容的原因,它也可以用作经典的JAR文件和类路径。那么module-info.class就被忽略了。说到类路径:通过引入模块概念,它是由一个替代ModulePath进行。在模块路径中,您可以指定在文件系统中找到特定模块的位置。
在过去,有一个类路径,一堆JAR无序,可以不可控制地使用对方。此外,JAR内的所有内容都可以访问。现在我们可以使用模块机制来明确定义哪个模块应该使用哪些模块。这使得可以使用相同库并行的多个版本。例如,模块A可以使用版本1中的库,版本2中的模块B,最后,模块C可以使用两个模块A和B.
使用Java 9的域驱动设计
通过模块概念,可以更好地表达软件架构。例如,层可以表示为模块,并且它们的界面可以被清楚地定义。编译器可以至少部分地检测并防止架构违规。我们举一个银行应用程序的例子,设计用域驱动的设计(清单2和图1)。
module de.wps.bankprogramm.domainLayer { exports de.wps.bankprogramm.domainLayer.valueObject; 出口 de.wps.bankprogramm.domainLayer.entity;}module de.wps.bankprogramm.infrastructurelayer { exports de.wps.bankprogramm.infrastructureLayer.database;}module de.wps.bankprogramm.applicationLayer { requires de.wps.bankprogramm.infrastructureLayer; 需要 de.wps.bankprogramm.domainLayer; 出口 de.wps.bankprogramm.applicationLayer.repositories;}module de.wps.bankprogramm.uiLayer { requires de.wps.bankprogramm.domainLayer; 需要 de.wps.bankprogramm.applicationLayer;}
系统的四层被实现为模块。专用逻辑层(即模块domainLayer)的模块被声明为与其他模块没有依赖关系。我们不想依赖技术代码来污染我们的业务代码。它包含一个用于我们系统的实体的包,一个用于它的值对象。的储存库,反过来,可以在基础设施层(模块infrastructureLayer)。因此,在这个设计中,它们被插入到应用层模块(applicationLayer)中。根据上述声明,可以访问基础设施和业务逻辑层。
用户界面层(uiLayer模块)可以访问用户逻辑和应用层。使用数据库访问代码的包将导致编译器错误,因为它在基础设施包中,并且没有在uiLayer的要求中指定。存储库到应用程序层的分配在架构上并不完全清晰,而是在这里完成,以避免使示例过于复杂。
将JDK切成块
模块机制对许多项目很有兴趣,特别是JDK本身。这是项目名称,拼图来自的地方。并用这个拼图Java应该分为模块。到目前为止,整个JRE必须始终交付,即使只运行没有GUI或不访问数据库的小程序。使用Java 9,JRE和JDK分解为模块本身。这允许每个程序定义它需要什么,减少内存使用和提高性能。
Java标准模块包括java.base,java.sql,java.desktop和java.xml。基本模块java.base总是隐式包含 - 就像包java.lang不需要单独导入一样。模块java.base将包含java.lang,java.math和java.io包。对于JDK本身的模块,JAR文件不够,因为它们也必须包含本机代码。因此,这里介绍了所谓的JMOD文件。Java的首席架构师Mark Reinhold的直接引用:“JMOD文件是类固醇的JAR文件”。项目拼图当然是Java 9带来的巨大变化,也是其主要功能。但还有一些其他功能将使开发人员的生活更轻松。
非常好我支持^.^
(0) 0%
不好我反对
(0) 0%