"package"和"module"之间有什么区别?

52
我使用Java,其中只有包。我知道还有其他编程语言也包括模块。
有什么区别?

9
类似于“function”和“method”之间的区别。 - Tom Neyland
5个回答

28
Java平台模块系统或JPMS是在发布时引入的。从那时起,Java同时拥有packagesmodules。那么它们之间有什么区别呢? 什么是Package? 一个package是一个命名空间,用于组织一组相关的类和接口。 什么是Module? 一个module是一组相关的Java packages和关联资源的集合,其中包含了一个描述文件,该文件包含了关于该module所暴露的哪些packages/resources、当前module使用了哪些packages以及其他信息。
我们可以将Java Module视为高于packages的更高级聚合层次。Module允许您将几个packages组织成一个单一的逻辑单元,并将它们作为一个整体系统进行分发。此外,JPMS提供了一种控制哪些packages对用户可见的方式。

24

在空洞中比较语义是很难的。(你指的是哪些其他语言?) "模块"可能类比于Java类,或Java包,或根据其他语言而定。通常来说,因为"模块"倾向于来自过程性语言,我更倾向于说Java类,但我认为这条线非常模糊,在那一点上你可以很有说服力地争论Java包。


1
Ruby让我想起来,另外我听说Java7将包括“模块”...但一般来说有什么区别(如果有的话)。例如,在过程化世界中,什么是模块? - OscarRyz
@OscarRyz:关于你的“什么是模块”问题,答案实际上取决于你在谈论哪种过程式语言。大体上来说,它们是符号作用域和打包机制,当然Java类和包也是这样。 - T.J. Crowder

20

Tom的评论说得很到位,不同的语言对于package和module都有不同的定义。因此,这个问题没有适用于所有语言的答案。

我会尝试从我了解的一些语言的角度来回答:

  • Java: 它有一个package的概念,基本上只是将Java类、接口等组织成命名空间的机制。它们需要层次结构。package并没有第一类的地位。值得一提的是,Java 7提出的superpackage有时也被称为module

  • Modula: module与Java的package在概念上相同,不需要层次结构。

  • C#: namespace与Java的package在概念上相同,不需要层次结构。

  • C++: namespace, 就像名称所示,这只是命名空间。不需要层次结构。

  • Haskell: module与Java的package在概念上相同。

  • Scala: 在Scala中,package与Java中的package相同,除了它们不需要层次结构。还放松了一些限制,比如每个文件只有一个公共类。object在Scala中也被称为模块,它们也享有第一类的地位。

  • F#: F#中的namespace与C# namespace相同。除了namespace之外,F#还有module,它们在CLR级别上实现为具有静态方法的.NET类。它们不是第一类实体。


我承认我对Java的定义也有点模糊。嗯,我不会把CSharp中的“命名空间”称为接近那样的东西。事实上,同一命名空间可能会出现在多个程序集中。 - Michael W. Powell

5

正如其他答案所述,模块的概念因语言而异,有些甚至没有(但有相应的对应物)。

然而,现在看来,模块更多地是一个概念,它指的是可以独立共享的一组源代码文件。按照这个定义,Java的jar文件不是模块,因为它们包含编译后的字节码文件(.class文件)。符合这个定义的模块系统将会在Java 9中引入(请参见此文章),并且还存在于其他具有模块或包管理器的语言中,通常直接将模块命名为packages(如Go lang/go tool、Python/pip、PHP/Composer等),其中包通常是打包好的模块。


模块仅限于源代码的错觉来自于可解释语言(如Ruby、PHP、Python、JS等),它们没有其他可以发布的内容。而机器码编译语言(如Go、C等)必须在每个平台上重新编译。Java工件的源代码是以JAR文件的形式分发的。在项目Jigsaw下完成的工作与您的定义无关。 - user2418306

0
一个包更类似于 C++ 命名空间而不是模块。模块更类似于封闭类而不是包。

1
在Java 9方面已经过时。 - user2418306
关于C ++,模块更像是提议的C ++模块。 - J. M. Becker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接