我使用 Java,我们只有包。我知道还有其他编程语言也包含模块。
有什么区别?
Java Platform Module System 或 JPMS 在 java-9 发布时引入。从那时起,Java 就同时拥有了
packages
和 modules
。那么它们有什么区别呢?
什么是套餐?
包是一个命名空间,它组织一组相关的类和 接口。
什么是模块?
模块是相关Java包和关联资源的集合,带有一个描述符文件,其中包含该模块公开了哪些包/资源、当前模块使用了哪些包以及其他一些信息。
我们可以将 Java 模块视为包之上的更高级别的聚合。模块允许您将几个包组织到一个逻辑单元中,并将它们作为一个整个系统进行分发。 JPMS 还提供了一种控制哪些包对用户可见的方法。
在虚空中很难比较语义。 (您指的是哪些其他语言?)“模块”可能类似于 Java 类、Java 包或完全其他的东西,具体取决于其他语言。通常,由于“模块”往往来自过程语言,所以我倾向于说 Java 类,但我认为在这一点上这条线非常模糊,你可以非常令人信服地争论包。
instanceofTom 的评论指出了这一点 - 不同的语言对包和模块有不同的定义。因此,这个问题没有与语言无关的答案。Java:它有一个
package
package
不具有头等舱地位。还值得注意的是,为 Java 7 提议的
superpackage
有时也称为
module
s。Modula:
module
package
s 概念相同。不需要层次结构。C#:
namespaces
package
概念相同。不需要层次结构。C++:
namespaces
module
package
s 概念相同。Scala:Scala 中的
package
package
相同,只是它们不需要分层结构。其他一些限制(例如每个文件一个公共类)也已放宽。 Scala 中的
object
也被称为模块,它们也享有一流的地位。F#:F# 中的
namespaces
namespace
相同。除了
namespace
之外,F# 还具有
modules
,它们在 CLR 级别实现为具有静态方法的 .NET 类。他们不是一流的实体。
参见本文
),并且存在于具有模块或包管理器的其他语言中,通常直接命名模块packages(Go lang / go工具,Python / pip、PHP/Composer...),其中包通常是打包模块。
包比模块更类似于 C++ 命名空间。模块更类似于封闭类而不是包。