为什么我们需要在 java-9 模块系统中使用静态?

gst*_*low 9 java java-platform-module-system java-9 java-module

我开始学习 jigsaw java-9 功能并阅读了一些文章/视频。

我无法理解可选依赖项的概念(requires static

引自文章

当一个模块需要针对另一个模块的类型进行编译但不想在运行时依赖它时,它可以使用 requires static 子句。如果 foo 需要 static bar,则模块系统在编译和运行时的行为会有所不同:

在编译时, bar 必须存在,否则会出错。在编译期间 bar 可由 foo 读取。
在运行时, bar 可能不存在,这不会导致错误或警告。如果它存在,它可以被 foo 读取。

所以我想知道几件事:

  1. 在编译时使模块依赖于另一个模块而不是运行时的原因是什么?任何例子?像龙目岛这样的乐器?

  2. java之前的java-9中可选依赖项的任何类似物?

聚苯乙烯

我找到了另一种解释:引自文章

有时我们编写引用另一个模块的代码,但我们库的用户永远不想使用。

例如,我们可能会编写一个实用程序函数,当另一个日志模块存在时,它可以漂亮地打印我们的内部状态。但是,并非我们库的每个使用者都需要此功能,并且他们不想包含额外的日志记录库。

在这些情况下,我们希望使用可选的依赖项。通过使用 requires 静态指令,我们创建了一个仅编译时依赖:

module my.module {
    requires static module.name;
}
Run Code Online (Sandbox Code Playgroud)

但对我来说完全不清楚。谁能用简单的方式解释一下?

Sla*_*law 10

  1. 有相当多的库只有在编译时才有意义。大多数情况下,这涉及仅在开发过程中提供帮助的注释(例如,防止错误,减少样板文件)。一些例子包括:


    这些注释往往有RetentionPolicyofSOURCECLASS,这意味着它们在运行时没有用(甚至不可用)。为什么在部署时将这些依赖项与应用程序的其余部分一起交付?如果没有,requires static您将被迫在部署时包含它们,否则您的应用程序将因缺少依赖项而无法启动。

  2. 您还可以将这些依赖项声明为可选的 Java 9 之前的版本。许多具有任何意义的 Java 项目都使用构建工具,例如 Maven 或 Gradle。除了那些自动构建和测试项目的工具之外,它们所做的很大一部分是依赖管理。我对 Maven 不够熟悉,但是在使用 Gradle 时,会使用:

    dependencies {
        compileOnly 'group.id:artifact-id:version'
    }
    
    Run Code Online (Sandbox Code Playgroud)

    声明运行时不需要的依赖项。