Java 9 嵌套(分层或父/子)模块

标签 java java-9

是否可以在 Java 9 中创建基于继承(或嵌套)的模块?

像这样:

module a
   |
   ├── module a1
   |   
   └── module a2

在这个例子中,a1a2 模块都是 a 的子模块。

如果我导入其中一个子模块,我将获得父模块 (a) 的功能以及该子模块中定义的任何功能。也就是说,我可以导入 a1,并明确访问 aa1 的功能(但不是 a2).

a1a2都是一个a,可以访问a的所有包,不需要必须向他们公开 a 的包。

最佳答案

您可以模拟您使用requires transitiveexports to 语法的组合:

  • requires transitive:指定导入此模块将固有地导入另一个模块。您可以使用它来确保 a1a2 导致 a 被导入。
  • exports to:这将允许您仅将功能导出到特定模块;这将允许您让 a 授予访问 a1a2 功能的权限,这些功能公开导出会很危险。

所以,举个例子:

module a {
    exports com.internal to a1;
    exports com.internal to a2;
}

module a1 {
    requires transitive a;
}

module a2 {
    requires transitive a;
}

在这种情况下,如果消费者依赖于 a1,他们将固有地依赖于 a(从而获得两者的效用)和 com. internal 包,虽然对内部使用的 a1 可见,但对消费者不可见。

这不是你要求的。 a1 不是 a。此外,a1 不能成为 aJLS不允许在导出中使用通配符(即:exports * to a1,这仍然不会使 a1 成为 a,但会使它更接近从务实的角度来看),并且模块中不存在允许它的其他语法。

关于Java 9 嵌套(分层或父/子)模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48747477/

相关文章:

java - Maven testCompile 适用于 Java 9 Build 166,但适用于 Build 167 失败

Java 9 JavaFX 预加载器

java - 有没有办法防止 ClosedByInterruptException?

java - 从 ECPrivateKey 生成 ECPublicKey

java - 如何实现适配器并过滤结果?

java - ConcatMap 没有选项并跳过错误 - RxJava

java - 有没有办法在 JAVA 接口(interface)及其特化之间进行转换?

Java 9.0 |类加载器::getResourceAsStream: NullPointerException

java - 从 Java 访问时,Scala public 变为 private?

java - 如何在 Java 9 中使用类加载器访问资源