【发布时间】:2011-04-10 12:01:51
【问题描述】:
我在只有包的地方使用 Java。我知道还有其他编程语言也包含模块。
有什么区别?
【问题讨论】:
-
类似'function'和'method'的区别
标签: java module package comparison
我在只有包的地方使用 Java。我知道还有其他编程语言也包含模块。
有什么区别?
【问题讨论】:
标签: java module package comparison
很难在虚空中比较语义。 (您指的其他语言是什么?)“模块”可能类似于 Java 类、Java 包或其他完全不同的东西,具体取决于其他语言。通常,由于“模块”往往来自过程语言,我倾向于说 Java 类,但我认为在这一点上这条线非常模糊,你可以非常有说服力地争论包。
【讨论】:
instanceofTom 的评论指出了这一点——不同的语言对包和模块有不同的定义。因此,这个问题没有与语言无关的答案。
我会尝试从我知道的一些语言的角度来回答:
Java:它有一个packages 的概念,它基本上只是一种将Java 类、接口等组织到命名空间中的机制。它们需要层次结构。 packages 没有头等舱身份。还可能值得注意的是,为 Java 7 提议的superpackages 有时也称为modules。
Modula:modules,在概念上与 Java 的 packages 相同。不需要层次结构。
C#:namespaces,在概念上与 Java 的 packages 相同。不需要层次结构。
C++:namespaces,顾名思义,这些只是命名空间。不需要层次结构。
Haskell:modules,在概念上与 Java 的 packages 相同。
Scala:Scala 中的packages 与Java 中的packages 相同,只是它们不需要层次结构。还放宽了其他一些限制,例如每个文件一个公共类。 objects 在 Scala 中也称为模块,也享有一流的地位。
F#:F# 中的 namespaces 与 C# namespaces 相同。除了namespaces,F# 还有modules,它们在CLR 级别实现为带有静态方法的.NET 类。它们不是一流的实体。
【讨论】:
namespaces 任何类似的东西。事实上,同一个命名空间可能会出现在多个 assemblies 中。
Java Platform Module System 或 JPMS 在java-9 发布时引入。从那时起,Java 既有packages 又有modules。那么它们有什么区别呢?
什么是包?
包是一个命名空间,它组织了一组相关的类和 接口。
什么是模块?
模块是相关 Java 包和相关资源与描述符文件的集合,其中包含有关此模块公开哪些包/资源、当前模块使用哪些包以及其他一些信息的信息。
我们可以将 Java 模块视为包之上的更高级别的聚合。模块允许您将几个包组织成一个单独的逻辑单元,并将它们作为一个完整的系统分发。 JPMS 还提供了一种方法来控制哪些包对用户可见。
【讨论】:
似乎,正如其他答案所述,模块的概念因一种语言而异,有些甚至没有(但有相应的对应物)。
不过,现在看来,模块更多是一个概念,指的是一组可以独立共享的源代码文件。按照这个定义,Java jar 文件不是模块,因为它们包含字节码编译文件(.class 文件)。符合此定义的模块系统将在 Java 9 (see this article) 中引入,并且存在于具有模块或包管理器的其他语言中,通常直接命名模块 packages (Go lang/go tool , Python/pip, PHP/Composer...) 其中包一般是打包模块。
【讨论】:
包比模块更类似于 C++ 命名空间。一个模块更像是一个封闭类而不是一个包。
【讨论】: