“包”和“模块”之间有什么区别?

时间:2010-09-09 21:59:19

标签: java module package comparison

我使用Java,我们只有包。我知道还有其他编程语言也包含模块。

有什么区别?

5 个答案:

答案 0 :(得分:24)

很难比较虚空中的语义。 (你的意思是什么?)“模块”可能类似于Java类,或Java包,或完全不同的东西,具体取决于其他语言。通常,因为“模块”往往来自过程语言,所以我倾向于使用Java类,但我认为该行非常模糊,你可以非常有说服力地争论包。

答案 1 :(得分:18)

instanceofTom的评论指出它 - 不同的语言对包和模块有不同的定义。因此,这个问题没有语言无关的答案。

我会尝试从我所知道的一些语言的角度回答它:

  • Java:它有package的概念,它基本上只是一种将Java类,接口等组织成命名空间的机制。它们需要分层结构。 package没有头等舱状态。值得注意的是,为Java 7提出的superpackage有时也被称为module s。

  • Modula:module,概念与Java的package相同。不要求分层结构。

  • C#:namespaces,概念与Java的package相同。不要求分层结构。

  • C ++:namespaces,如名称所示,这些只是命名空间。不要求分层结构。

  • Haskell:module s,概念与Java的package相同。

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

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

答案 2 :(得分:5)

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

然而,现在似乎模块更像是一个概念,它指的是一组可以独立共享的源代码文件。遵循此定义,Java jar文件不是模块,因为它们包含字节码编译文件(.class文件)。符合此定义的模块系统将在Java 9(see this article)中引入,并存在于具有模块或包管理器的其他语言中,通常直接命名模块 packages (Go lang / go tool,Python / pip,PHP / Composer ...)其中包通常是打包的模块。

答案 3 :(得分:3)

在发布Java Platform Module System时引入了

或JPMS。从那时起,Java同时拥有packagesmodules。那么它们之间有什么区别?

什么是软件包?

  

包是一个命名空间,它组织一组相关的类,并且   接口。

什么是模块?

  

一个模块是相关的Java软件包以及带有描述符文件的相关资源的集合,该描述符文件包含有关此模块公开哪些软件包/资源,当前模块使用哪些软件包以及其他一些信息的信息。

我们可以将Java模块看作是软件包之上的更高级别的聚合。模块使您可以将几个软件包组织到一个逻辑单元中,并将它们作为一个完整的系统进行分发。 JPMS还提供了一种控制哪些软件包对用户可见的方法。

答案 4 :(得分:0)

包更像是C ++命名空间而不是模块。模块更类似于封闭类而不是封装类。