JDK9模块如何帮助“封装范围的子包”?

我想知道JDK9模块。 假设您有以下3个包:

com.company.product com.company.product.impl_a com.company.product.impl_b 

product.impl_aproduct.impl_b中的类只能由包product的类访问。 用户应该只使用product包中的类。 您可以想象,传递某些标志或属性将决定是否在内部使用impl_aimpl_b

在JDK8-中,您必须在impl_aimpl_b public创建这些类。 这有点糟糕 ,因为可以欺骗用户他们可以使用这些类。 它完全有效且允许。

JDK9如何在这里提供帮助? 我们是否会为product.impl_a声明一个模块,为product.impl_a声明另一个模块,并声明导出的类只能由第三个模块product访问,这将取决于两个模块product.impl_aproduct.impl_b ? 另外,声明一个依赖于product.impl_aproduct.impl_b的新模块实际上是不可能的。 其他模块只能依赖于模块product吗?

您的问题中没有任何内容似乎表明这三个软件包需要最终用于不同的JAR /模块。 如果他们不这样做,只需将它们放入同一个JAR中,使用所述的可见性修饰符,并使用以下模块声明:

 module com.company.product { export com.company.product; } 

然后模块com.company.product中,您可以像往常一样使用所有包中的代码,但是从外部只能访问 com.company.product

您可以让包impl_aimpl_bpublic并将包导出到特定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