是否可以在 Java 9 中创建基于继承(或嵌套)的模块?
像这样:
module a
|
├── module a1
|
└── module a2
在这个例子中,a1
和 a2
模块都是 a
的子模块。
如果我导入其中一个子模块,我将获得父模块 (a
) 的功能以及该子模块中定义的任何功能。也就是说,我可以导入 a1
,并明确访问 a
和 a1
的功能(但不是 a2
).
a1
和a2
都是一个a
,可以访问a
的所有包,不需要必须向他们公开 a
的包。
最佳答案
您可以模拟您使用requires transitive
和exports to
语法的组合:
requires transitive
:指定导入此模块将固有地导入另一个模块。您可以使用它来确保a1
和a2
导致a
被导入。exports to
:这将允许您仅将功能导出到特定模块;这将允许您让a
授予访问a1
和a2
功能的权限,这些功能公开导出会很危险。
所以,举个例子:
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
不能成为 a
; JLS不允许在导出中使用通配符(即:exports * to a1
,这仍然不会使 a1
成为 a
,但会使它更接近从务实的角度来看),并且模块中不存在允许它的其他语法。
关于Java 9 嵌套(分层或父/子)模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48747477/