JDK9模块如何帮助“封装范围的子包”?
我想知道JDK9模块。 假设您有以下3个包:
com.company.product com.company.product.impl_a com.company.product.impl_b
包product.impl_a
和product.impl_b
中的类只能由包product
的类访问。 用户应该只使用product
包中的类。 您可以想象,传递某些标志或属性将决定是否在内部使用impl_a
或impl_b
。
在JDK8-中,您必须在impl_a
和impl_b
public
创建这些类。 这有点糟糕 ,因为可以欺骗用户他们可以使用这些类。 它完全有效且允许。
JDK9如何在这里提供帮助? 我们是否会为product.impl_a
声明一个模块,为product.impl_a
声明另一个模块,并声明导出的类只能由第三个模块product
访问,这将取决于两个模块product.impl_a
和product.impl_b
? 另外,声明一个依赖于product.impl_a
或product.impl_b
的新模块实际上是不可能的。 其他模块只能依赖于模块product
吗?
您的问题中没有任何内容似乎表明这三个软件包需要最终用于不同的JAR /模块。 如果他们不这样做,只需将它们放入同一个JAR中,使用所述的可见性修饰符,并使用以下模块声明:
module com.company.product { export com.company.product; }
然后在模块com.company.product中,您可以像往常一样使用所有包中的代码,但是从外部只能访问 com.company.product
。
您可以让包impl_a
和impl_b
是public
并将包导出到特定module
(合格的导出),您可以使用以下约定:
exports com.company.product.impl_b to third.module;
所以,在你的情况下考虑这些
module first.module { export com.company.product.impl_a to second.module; export com.company.product.impl_b to third.module; }
这意味着com.company.product.impl_a
包只导出到second.module
,现在读取first.module
可以访问impl_a
包中的类的公共类型,同样com.company.product.impl_b
只是导出到third.module
。