当前位置:首页 > 每日看点 > 正文内容

ja9模块化在应用上有什么价值?

卡卷网1年前 (2025-01-10)每日看点227

我是大明哥,一个专注<>「死磕Ja」的硬核程序员。


Ja9中最大的特性毫无疑问就是模块化,其实模块化的概念在Ja7的时候就已经提出来了,由于它的复杂性,不断跳票,从Ja7到Ja8,最后Ja9终于姗姗来迟,它的出现犹如壮士断腕。

那模块化到底是什么呢?在实际开发中又有什么用呢?这篇文章大明哥带你彻底了解Ja9的模块化。

什么是模块化

模块是Ja9中新增的一个组件,是这么定义它的:**一个被命名的,代码和数据的自描述。(themodule,whichisanamed,self-descriingcollectionofcodeanddata)。**怎么理解呢?我们可以简单地将它理解为package的上一级单位,是多个package的。

我们知道在Ja中,Ja文件是最小的可执行文件,为了更好地这些Ja文件,我们需要用package将同一类的Ja文件一起来,多个package文件、Ja文件可以打包成一个jar文件,现在Ja9在package上面增加module,一个module可以包含多个package,所以从代码结构上来看层级关系是这样的:jar>module>package>ja文件

所以,从本质上来说,模块就是用来各个package的组件,它的概念,其实就可以理解为在package上面再包一层,包这一层的主要目的是让我们能够更好地组织和Ja应用程序的代码,以及更好地控制代码的可见性和依赖关系。

要掌握模块化,就需要理解它的几个核心概念:

    模块(Module):模块是模块化的基本单元。它是一个逻辑上的代码单元,包括类、接口、资源和module-.ja文件。每个模块都有一个唯一的名称,例如:"ja.ase"、"com.example.myapp"等。模块路径(ModulePath):模块路径是一组包含模块的路径,用于在运行时指定应用程序所需的模块。类似于类路径,但它是用于模块。module-.ja文件:每个模块都包含一个特殊的文件,名为module-.ja。这个文件描述了模块的信息,包括模块名称、依赖关系、导出的包以及模块信息。模块依赖性(ModuleDependencies):在module-.ja文件中,可以使用requires关键字声明模块之间的依赖关系。模块导出(ModuleExporting):在module-.ja文件中,可以使用exports关键字声明哪些包可以被模块访问,这有助于控制包的可见性。

模块化怎么体现的呢?下图是Ja8与Ja9的目录结构:

从上图中你会发现Ja9中没有jre,没有rt.jar,没有tools.jar,而是多了一个jmods,该文件夹下都是一个一个的模块:

对于Ja9之前的工程,他们都是单体模式,一个简单的helloworld,都需要引入rt.jar,导致这个简单的helloworld的jar变得很大,而Ja9引入模块后,它只需要引入它所依赖的即可。

为什么需要模块化

在Ja9之前我们没有使用模块化之前用起来还是很顺手的,现在突然在package上面增加一层module,势必会增加我们编码的复杂度,既然增加了复杂度为什么还要引入呢?其实引入模块化有着几个非常好的优势。

<>1、显式依赖

模块化需要我们明确申请模块之间的依赖关系,它减少了传类路径(classpath)上的混乱和不稳定性。每个模块都需要显示声明自己需暴露的package,而自己所依赖的和自己内部使用的package,则不会暴露,也不会被外部依赖,这有助于保护内部实现,防止不应该公开的部分被外部模块访问。依赖的模块也需要显示引入需要依赖的package

<>2、更好地安全性

模块化可以提供更严格的可见性控制,防止私有实现被不应访问的模块访问,从而增强了应用程序的安全性。代码正意义上可以按照作者的设计思路进行公开和隐,同时也了反射的滥用,更好的保护了那些不建议被外部直接使用或过时的内部类。

<>3、标准化

模块化引入了标准化的方式来组织和代码。显示的声明暴露的内容,可以让第三方库的开发者更好地自己的内部实现逻辑和内部类。

<>4、自定义最小运行时映像

Ja因为其向后兼容的原则,不会轻易对其内容进行删除,包含的陈旧过时的技术也越来越多,导致JDK变得越来越臃肿。而Ja9的显示依赖使得加载最小所需模块成为了可能,我们可以选择只加载必须的JDK模块,抛弃如ja.awt,jax.swing,ja.applet等这些用不到的模块。这种机制,大大的减少了运行Ja环境所需要的内存资源,在对于嵌入式开发或硬件资源受限的场景下的开发非常有用。

<>5、更加适合大型应用程序

于大型应用程序,模块化提供更好的组织结构,减少了复杂性,使开发者能够更轻松地和扩展应用程序。

<>6、更好的性能

通过减少不必要的类路径搜索和提供更紧凑的部署单元,模块化有助于提高应用程序的性能。

怎么用模块化

使用Ja9的模块化主要分为以下几个步骤。

<>1、创建模块

创建一个modulemodule下面包含该模块的代码和module-.ja文件。module-.ja文件是每个模块的关键组成部分,它描述了模块的信息,包括名称、依赖关系和导出的包。

这里我们新建两个moduleja-module-01ja-module-02,同时ja-module-01依赖ja-module-02,如下:

这里可能有小伙伴不知道怎么新建module-.ja,其实只需要在ja下面右键new就可以了:

如果这里没有,则表示你modulejdk没有配置好,配置下就可以了:

<>2、定义模块信息

新建模块后,我们就需要在module-.ja中定义模块信息了,信息主要包括如下几个部分:

    使用module关键字定义模块,并指定模块的名称,例如:moduleja.module01{}使用requires关键字声明模块之间的依赖关系,例如:requiresja.sql;表示模块依赖于ja.sql模块。使用exports关键字声明模块中哪些包可以被模块访问,例如:exportscom.skja.module01.entity;表示导出com.skja.module01.entity包。

我们在ja-module-02定义了com.skja.module02.entitycom.skja.module02.serv两个包,同时将com.skja.module02.entity暴露出去:

moduleja.module02{ exportscom.skja.module02.entity; }

entitypackage新建UserEntity类,servpackage中新建UserServ接口:

pulicclassUserEntity{ privateStringuserName; privateIntegerage; pulicUserEntity(StringuserName,Integerage){ this.userName=userName; this.age=age; } }

如果我们在ja-module-01中不申请引入模块ja.module02,我们是无法使用UserEntity这个类的。所以我们在ja-module-01中的module-.ja引入ja.module02

moduleja.module01{ requiresja.module02; }

这个时候我们就可以放心地在ja-module-01中使用com.skja.module02.entity的内容了:

importcom.skja.module02.entity.UserEntity; pulicclassUserServ{ pulicstaticvoidmain(String[]args){ UserEntityuser=newUserEntity("大明哥",18); System.out.println(user); } }

看UserEntity导入的包是不是com.skja.module02.entity。那可以使用com.skja.module02.serv中的UserServ呢?不可以,因为ja-module-02并没有将com.skja.module02.serv暴露出去。

这里只是阐述一种较简单的使用方式,在实际项目中使用情况会更加复杂,这些都需要我们在工作过程中不断地去探索。


大明哥花了两个月时间终于写完了Ja8~Ja21所有的重要特性,整个系列共63篇文章,11w+字。欢迎各位查阅:

Ja8+新特性知识体系-死磕Ja

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2025/01/8546.html

分享给朋友:

相关文章

为什么程序员不自己开发微信小程序这类似的东西赚钱?

为什么程序员不自己开发微信小程序这类似的东西赚钱?

你如果有好的想法是可以挣钱的首先大家说的个人资质限制确实多,也不建议直接拿个人资质去用小程序盈利,因为很麻烦我说一下我的大体操作:1.首先去申请个体户,这个可以用住宅来注册申请,而且速度很快就几天就下来了,经营类目主要是互联网销售这些,不过...

有没有推荐什么手游搬砖,或者是用手机就能做的工作能日入100左右就好了?

有没有推荐什么手游搬砖,或者是用手机就能做的工作能日入100左右就好了?

大家好,我是思聪。思聪游戏搬砖社每天分享真实靠谱的游戏赚钱的方法。整个游戏的攻略用一句话概括就是:打元宝兑换平台物品,xx元宝兑换一个分红物品。你把你打游戏得来的元宝去兑换平台的分红物品,就能每天领取xx元的分红。(具体看是哪个分红物品,比...

腾讯云为何在云服务市场败给了阿里云?

IDC领域,2010年以前,万网、新网互联、新网,三家公司瓜分天下,其中万网市场份额最高,排名第一。当时,万网的域名是http://www.net.cn,通过该域名就可以判断万网的地位。2010年阿里云成立,直接收购了万网,大量用户直接流向...

想入个键盘,想买机械的但是太贵,求知友推荐一款手感比较好的薄膜键盘?

想入个键盘,想买机械的但是太贵,求知友推荐一款手感比较好的薄膜键盘?

相信很多接触过286的90后朋友都和我有一样的体会,以前的机械键盘真的是让人头皮发麻,不仅敲击要非常用力,而且很吵。所以后面随着大家的生活消费水平的上升,家家户户都有电脑了,自然也不想再用打字来宣扬自己有电脑的优越感,基本上大家都换成了又轻...

想学习Linux下的ELF文件有什么好书推荐吗?

想学习Linux下的ELF文件有什么好书推荐吗?

大家好,这里是物联网心球。 今天我们来聊聊ELF文件,了解一下Linux如何创建进程以及ELF文件如何转变成Linux进程?1.什么是ELF文件? ELF(Executable and Linkable Format)文...

你见过哪些有趣的偏微分方程组?

你见过哪些有趣的偏微分方程组?

说说我一直在做的一个偏微分方程系统吧,该模型为生物领域的趋化性(chemotaxis)模型,也叫Keller-Segel模型,由该二人于1971年左右提出,用于刻画细胞或者细菌的趋化机制。解释一下趋化性(chemotaxis):趋化性是指单...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。