有什么区别?
packages
和modules
。那么它们之间有什么区别呢?
什么是Package?
一个package是一个命名空间,用于组织一组相关的类和接口。
什么是Module?
一个module是一组相关的Java packages和关联资源的集合,其中包含了一个描述文件,该文件包含了关于该module所暴露的哪些packages/resources、当前module使用了哪些packages以及其他信息。在空洞中比较语义是很难的。(你指的是哪些其他语言?) "模块"可能类比于Java类,或Java包,或根据其他语言而定。通常来说,因为"模块"倾向于来自过程性语言,我更倾向于说Java类,但我认为这条线非常模糊,在那一点上你可以很有说服力地争论Java包。
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的jar文件不是模块,因为它们包含编译后的字节码文件(.class文件)。符合这个定义的模块系统将会在Java 9中引入(请参见此文章),并且还存在于其他具有模块或包管理器的语言中,通常直接将模块命名为packages(如Go lang/go tool、Python/pip、PHP/Composer等),其中包通常是打包好的模块。