首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在Java 9中包和模块是独立的概念?

为什么在Java 9中包和模块是独立的概念?
EN

Software Engineering用户
提问于 2016-02-27 22:10:34
回答 1查看 19.3K关注 0票数 28

除了包之外,Java 9还将包含模块。语言通常有一种或另一种。大多数程序员将两个术语称为同义词( 感悟 )。

模块构建在包的基础上,将它们视为原语。

复合模式建议对原语和复合材料进行均匀处理。不然的话坏事就会发生。例如,看看项目Valhalla,在那里,他们试图为基本类型(值)和引用类型修改公共的超级类型。

模块和包是否代表语义上独立的概念?

这意味着在任何语言(关注点分离)中同时使用这两种语言都是明智的。或者Java必须两者兼而有之,以实现向后兼容性?

为什么要引入一个新的概念而不是扩大现有的概念呢?

JSR 376:在项目拼图中实现的"Java平台模块系统“。

根据SOTMS

模块是一个命名的、自描述的代码和数据集合.它的代码被组织成一组包含类型的包,即Java类和接口;它的数据包括资源和其他类型的静态信息。

JLS小心地避免定义什么是包。来自维基百科

Java包是一种将Java类组织成类似于Modula模块的命名空间的技术,它提供了Java中的模块化编程。

我知道引用维基百科是一种错误的做法,但它反映了共同的理解。来自模块化编程的条目

有时使用包一词代替模块(如Dart、Go或Java中的)。在其他实现中,这是一个不同的概念;在Python中,包是模块的集合,而在即将到来的Java 9中,计划引入新的模块概念(具有增强访问控制的包集合)。

EN

回答 1

Software Engineering用户

发布于 2016-03-23 00:42:38

模块的概念不同于该概念的实例化。

Java一直都有模块。方法是模块,类是类,包也是。模块是一个组织单位,在其中隐藏内部细节,并通过商定的合同与其他模块进行通信。例如,方法是一个模块,因为它有隐藏的内部(代码和局部变量)和契约(参数和返回类型)。模块可以由低级模块组成,例如类包含方法。

核心Java (预-9)缺少的是一个可部署的模块。以上所有类型的模块都不是可以复制的可部署单元。Java确实有一个名为JAR文件的可部署工件,但它们不是模块,因为它们没有封装或契约:在运行时,JAR文件消失,所有这些都合并到一个单独的“类路径”中。

1998年,OSGi用“包”的概念解决了缺乏可部署模块的问题。这些实际上是JAR文件,它们包含包,但是OSGi与运行时系统一起定义了额外的元数据,以支持该级别的封装和契约。

Java9以类似于OSGi的方式解决了缺乏可部署模块的问题。可以说,这是完全没有必要的,因为OSGi的存在和工作,但这是一个完全不同的讨论。

不幸的是,Java 9将新的模块概念命名为“模块”,从而混淆了这一问题。这并不意味着方法、类和包不再是模块!J9“模块”只是模块概念的另一个实例化。与OSGi包一样,J9模块是由包组成的,它们是可以复制的物理构件(通常是JAR文件)。运行时系统理解并重新表示它们。

摘要:是的,J9模块和包在语义上是独立的概念。显然,为了向后兼容,Java必须保留其现有的包概念。请注意,“包”一词在Java中的使用与其他语言或在包管理系统(如RPM )中的使用非常不同。与以往相比,新的J9模块(和OSGi包)更像RPM中的包。

票数 33
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/311280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档