JDK9模块如何帮助实现封装范围的子包'?

时间:2017-11-17 08:34:19

标签: java java-9

我想知道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_b声明另一个模块,并声明导出的类只能由第三个模块product访问,这取决于两个模块{{ 1}}和product.impl_a?另外,实际上不可能声明一个取决于product.impl_bproduct.impl_a的新模块?其他模块是否只能依赖模块product.impl_b

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

您可以让包impl_aimpl_b中的类为public并将包导出到特定module s (qualified exports),您可以使用惯例为:

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中类的公共类型{1}}包和com.company.product.impl_b同样只会导出到third.module