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

问题描述 投票:0回答:5

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

有什么区别?

java module package comparison
5个回答
27
投票

Java Platform Module System 或 JPMS 在 发布时引入。从那时起,Java 就同时拥有了

packages
modules
。那么它们有什么区别呢?

什么是套餐?

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

什么是模块?

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

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


24
投票

在虚空中很难比较语义。 (您指的是哪些其他语言?)“模块”可能类似于 Java 类、Java 包或完全其他的东西,具体取决于其他语言。通常,由于“模块”往往来自过程语言,所以我倾向于说 Java 类,但我认为在这一点上这条线非常模糊,你可以非常令人信服地争论包。

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

20
投票
我会尝试从我所知道的一些语言的角度来回答:

Java:它有一个
    package
  • 的概念,它基本上只是一种将 Java 类、接口等组织到命名空间中的机制。它们需要层次结构。

    package

    不具有头等舱地位。还值得注意的是,为 Java 7 提议的 
    superpackage
     有时也称为 
    module
    s。

    Modula:
  • module
  • s,与 Java 的

    package

    s 概念相同。不需要层次结构。

    C#:
  • namespaces
  • ,与 Java 的

    package

     概念相同。不需要层次结构。

    C++:
  • namespaces
  • ,顾名思义,这些只是命名空间。不需要层次结构。

    Haskell:
  • module
  • s,与 Java 的

    package

    s 概念相同。

    Scala:Scala 中的
  • package
  • 与 Java 中的

    package

     相同,只是它们不需要分层结构。其他一些限制(例如每个文件一个公共类)也已放宽。 Scala 中的
    object
    也被称为模块,它们也享有一流的地位。

    F#:F# 中的
  • namespaces
  • 与 C#

    namespace

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

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

5
投票
不过,现在看来模块更多的是一个概念,指的是一组可以独立共享的源代码文件。根据此定义,Java jar 文件不是模块,因为它们包含字节码编译文件(.class 文件)。符合此定义的模块系统将在 Java 9 中引入(

参见本文

),并且存在于具有模块或包管理器的其他语言中,通常直接命名模块

packages(Go lang / go工具,Python / pip、PHP/Composer...),其中包通常是打包模块。

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

0
投票

© www.soinside.com 2019 - 2024. All rights reserved.