What's the difference between “package” and “module”
我使用Java,我们只有包。我知道还有其他的编程语言也包括模块。
有什么区别?
谢谢
在虚空中很难比较语义。(你说的其他语言是什么意思?)一个"模块"可能类似于Java类,或者Java包,或者完全依赖于其他语言。通常,由于"模块"往往来自过程语言,我倾向于说Java类,但我认为在这一点上,这一行非常模糊,您可以很有说服力地对包进行辩论。
InstanceOfom的注释将其钉住——不同的语言对包和模块有不同的定义。因此,这个问题没有语言不可知论的答案。
我将尝试从我所知道的一些语言的角度来回答:
Java:它有一个
package s的概念,它基本上只是一种将Java类、接口等组织到命名空间中的机制。它们需要层次结构。package 没有头等舱地位。还值得注意的是,对于Java 7提出的EDCOX1的2度有时也被称为EDCOX1×3×S。Modula:EDOCX1,3,s,在概念上与Java的EDCOX1,0,s相同,不需要层次结构。
E.Ocxx1,6,在概念上与Java的EDCOX1,0,s相同,不需要层次结构。
C++:EDCOX1×6,顾名思义,这些只是命名空间。不需要层次结构。
Haskell:EDCOX1,3,s,在概念上与Java的EDCOX1,0,s相同。
斯卡拉:EDCX1〔0〕s在斯卡拉与爪哇的EDCX1〔0〕相同,只是不需要层次结构。还有一些限制,比如每个文件一个公共类,也被放宽了。scala中的
object s也被称为模块,它们也享有一流的地位。f:f中的
namespaces 与cnamespace s相同。除了namespace s之外,f还具有modules ,它们在clr级别用静态方法实现为.NET类。他们不是一流的实体。
似乎,正如其他答案所述,模块的概念因语言而异,有些甚至没有模块(但相应的对应模块)。
然而,现在看来,模块更像是一个概念,指的是一组可以独立共享的源代码文件。按照这个定义,JavaJAR文件不是模块,因为它们包含字节码编译文件(.class文件)。遵照这个定义的模块系统将在Java 9中引入(见本文),并且存在于具有模块或包管理器的其他语言中,通常直接命名模块包(Go Lang/Go工具、Python/PIP、PHP/作曲家……),其中包通常是打包模块。
Java9发布时引入了Java平台模块系统或JPMS。从那时起,Java既有EDCOX1,也有EDCX1,18,EDCX1,17。那么他们之间有什么区别呢?
什么是包裹?
A package is a namespace that organizes a set of related classes and
interfaces.
什么是模块?
A module is a collection of related Java packages and associated resources with a descriptor file, which contains information about which packages/resources are exposed by this module, which packages are used by current module and some other information.
我们可以把Java模块的东西作为一个更高层次的聚合。模块允许您将几个包组织成一个单独的逻辑单元,并将它们作为一个整体系统分发。此外,JPMS还提供了一种控制哪些包对用户可见的方法。
与模块相比,包更类似于C++命名空间。模块比包更类似于封闭类。