首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们需要在java-9模块系统中需要静态?

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

Stack Overflow用户
提问于 2019-05-16 14:00:31
回答 2查看 1.3K关注 0票数 10

我开始学习拼图java-9特性,并阅读了一些文章/视频。

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

来自文章的报价

当一个模块需要针对来自另一个模块的类型进行编译,但不希望在运行时依赖它时,它可以使用requires静态子句。如果foo需要静态栏,则模块系统在编译和运行时的行为不同: 在编译时,必须出现条形图,否则会出现错误。在编译期间,foo可以读取栏。 在运行时,可能没有bar,这既不会导致错误,也不会导致警告。如果它存在,那么foo就可以读取它。

所以我想知道几件事:

  1. 在编译时而不是在运行时使模块依赖于另一个模块的原因是什么?有什么例子吗?像lombok这样的乐器?
  2. 在java以前的java-9中,有类似于可选依赖项的吗?

附注:

我又找到了一个解释:引用文章

有时,我们编写的代码引用了另一个模块,但是我们库的用户永远不想使用这些代码。 例如,我们可以编写一个实用程序函数,当另一个日志模块出现时,它可以很好地打印我们的内部状态。但是,并不是我们库的每个使用者都想要这个功能,而且他们也不想包含额外的日志库。 在这些情况下,我们希望使用一个可选的依赖项。通过使用requires静态指令,我们创建了一个只编译时的依赖关系:

代码语言:javascript
复制
module my.module {
    requires static module.name;
}

但我完全不清楚。有人能简单地解释一下吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-16 14:13:29

  1. 有相当数量的库存在,只有在编译时拥有它们才有意义。大多数情况下,这涉及到只存在于开发过程中的注释(例如,防止bug、减少样板)。一些例子包括:
代码语言:javascript
复制
- [java-annotations](https://github.com/JetBrains/java-annotations) by JetBrains
- [spotbugs-annotations](https://github.com/spotbugs/spotbugs) by SpotBugs (successor of FindBugs)
- [Project Lombok](https://projectlombok.org/) (as you mentioned)
- [jcip-annotations](https://github.com/stephenc/jcip-annotations)

这些注释往往有一个RetentionPolicy of SOURCECLASS,这意味着它们在运行时没有用处(甚至不可用)。为什么在部署时将这些依赖项与应用程序的其他部分一起发布?如果没有requires static,您将被迫在部署时包含它们,否则由于缺少依赖关系,应用程序将无法启动。

  1. 您还可以将这些依赖项声明为可选的预Java 9。许多有意义的Java项目都使用诸如Maven或Gradle之类的构建工具。除了这些工具自动构建和测试您的项目之外,它们所做的很大一部分工作是依赖关系管理。我对Maven还不太熟悉,但是在使用Gradle 1时会使用: 依赖项{ compileOnly‘组p.id:工件-id:version’} 声明运行时不需要的依赖项。
票数 10
EN

Stack Overflow用户

发布于 2019-05-16 15:15:55

如果依赖模块应该在编译时可用,但在瘤时是可选的,那么这种类型的依赖被称为可选依赖。我们可以使用静态关键字指定可选的依赖项。

注释静态关键字用于表示“此依赖项检查在编译时是强制性的,在运行时是可选的。”

Eg.1

代码语言:javascript
复制
module moduleB {
  requires moduleA;
}

moudleA应该在编译的时候就有了&乱七八糟的。这不是可选的依赖关系。

Eg2。

代码语言:javascript
复制
module moduleB {
   requires static moduleA;
}

在编译时,moduleA应该是可用的,但是在运行时它是可选的,也就是说,在运行时,即使是moduleA也是不可缺少的,JVM将执行代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56170361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档