我想知道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_b
声明另一个模块,并声明导出的类只能由第三个模块product
访问,这取决于两个模块{{ 1}}和product.impl_a
?另外,实际上不可能声明一个取决于product.impl_b
或product.impl_a
的新模块?其他模块是否只能依赖模块product.impl_b
?
答案 0 :(得分:5)
您的问题中似乎没有任何内容表明这三个软件包需要最终用于不同的JAR /模块。如果他们没有,只需将它们放入同一个JAR中,使用所述的可见性修饰符,并使用以下模块声明:
module com.company.product {
export com.company.product;
}
然后在模块 com.company.product 中,您可以像往常一样使用所有包中的代码,但只能使用外部 {{ 1}}是accessible。
答案 1 :(得分:3)
您可以让包impl_a
和impl_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
。