跟我学java9之模块化module

       模块化是java9引入的最重要的功能,之前我们发布程序的时候使用classpath后面会有很多的jar包,程序包会很大,引入模块化之后,我们就可以根据需要来使用自己真正需要的模块,为代码瘦身,而且模块之间的依赖关系可以理清楚,哪些接口可以开放出去,供外面依赖,哪些接口可以只开发给部门模块,这样就避免了随便引用,C#在这方面就做的不错。java9的模块化功能孵化自JigSaw项目,有兴趣的可以了解下。

1.为了使用模块化的功能,我特地安装了Idea2017.03 IDEA-EAP版本,这个是支持java9的

2.新建一个空的java9项目testjava9

3.新建几个模块china,american,japan,trade

4.如何定义模块

右键某个模块下的src目录,会出现module-info.java,这个文件就是模块的描述文件


跟我学java9之模块化module_第1张图片

在china模块下定义China接口


跟我学java9之模块化module_第2张图片

将China的实现类放在impl包下面


跟我学java9之模块化module_第3张图片

如下图所示是一个模块定义


跟我学java9之模块化module_第4张图片

其中module后面代表模块名,一般用包名表示,也可以自己随便定义

如果我们需要将com.alex.china发布出去,供外部引用,就可以使用exports关键字

如果我们想要控制这个模块某个包只供trade模块使用,就可以使用

exports com.alex.china.impl to com.alex.trade

5.其他模块的定义如下:

如下图所示,japan模块和american模块都是依赖于china模块的,他们都是china的孩子

跟我学java9之模块化module_第5张图片


跟我学java9之模块化module_第6张图片

Chinese,American和Japan是China的实现类。trade模块依赖于china,japan,american模块


跟我学java9之模块化module_第7张图片

有时候我们需要将实现类放在单独的模块,不想让trade模块看到具体的实现细节,就可以在trade模块这样声明,uses com.alex.china.China;

在japan,american,china模块可以这样声明

exports com.alex.japan;

provides com.alex.china.China  with com.alex.japan.Japan;

这样trade模块就只能看到接口,屏蔽了实现类的细节,实现了严格的包的依赖管理。

6.下面是trade模块的代码:


跟我学java9之模块化module_第8张图片
跟我学java9之模块化module_第9张图片

MarkdownCountries负责将list中的字符串加*前缀并且换行

如果我们要加载其他模块的类,就需要使用java9新提供的ServiceLoader接口,

ServiceLoader.load(China.class).forEach(chinaList::add);

程序运行结果如下:


模块运行的时候使用java -p选项,怎么样是不是很实用,模块化的功能还在摸索中,难免有错误,欢迎指正!


小结:

模块化就相当于在原来package的外面加了一个module的定义

具体结构是module,package,class

模块化的程序结构如下:


跟我学java9之模块化module_第10张图片

out是程序运行后生成的产出目录,当然java9的模块化可以和maven的模块化一起组合运用,java9的模块化可以让我们更加严格控制包的依赖管理,让我们的程序结构更加合理,不用在羡慕C#!

欢迎关注我的公众号:


跟我学java9之模块化module_第11张图片
@程序员

你可能感兴趣的:(跟我学java9之模块化module)