我开始学习拼图java-9特性,并阅读了一些文章/视频。
我无法理解可选依赖的概念(requires static)
来自文章的报价
当一个模块需要针对来自另一个模块的类型进行编译,但不希望在运行时依赖它时,它可以使用requires静态子句。如果foo需要静态栏,则模块系统在编译和运行时的行为不同: 在编译时,必须出现条形图,否则会出现错误。在编译期间,foo可以读取栏。 在运行时,可能没有bar,这既不会导致错误,也不会导致警告。如果它存在,那么foo就可以读取它。
所以我想知道几件事:
附注:
我又找到了一个解释:引用文章
有时,我们编写的代码引用了另一个模块,但是我们库的用户永远不想使用这些代码。 例如,我们可以编写一个实用程序函数,当另一个日志模块出现时,它可以很好地打印我们的内部状态。但是,并不是我们库的每个使用者都想要这个功能,而且他们也不想包含额外的日志库。 在这些情况下,我们希望使用一个可选的依赖项。通过使用requires静态指令,我们创建了一个只编译时的依赖关系:
module my.module {
requires static module.name;
}但我完全不清楚。有人能简单地解释一下吗?
发布于 2019-05-16 14:13:29
- [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 SOURCE或CLASS,这意味着它们在运行时没有用处(甚至不可用)。为什么在部署时将这些依赖项与应用程序的其他部分一起发布?如果没有requires static,您将被迫在部署时包含它们,否则由于缺少依赖关系,应用程序将无法启动。
发布于 2019-05-16 15:15:55
如果依赖模块应该在编译时可用,但在瘤时是可选的,那么这种类型的依赖被称为可选依赖。我们可以使用静态关键字指定可选的依赖项。
注释静态关键字用于表示“此依赖项检查在编译时是强制性的,在运行时是可选的。”
Eg.1
module moduleB {
requires moduleA;
}moudleA应该在编译的时候就有了&乱七八糟的。这不是可选的依赖关系。
Eg2。
module moduleB {
requires static moduleA;
}在编译时,moduleA应该是可用的,但是在运行时它是可选的,也就是说,在运行时,即使是moduleA也是不可缺少的,JVM将执行代码。
https://stackoverflow.com/questions/56170361
复制相似问题