Java子包之间的私有类

3
我的Java库由几个子包(com.example.lib.api,com.example.lib.imp,com.example.lib.util等)组成。
api中的类使用imp中的A和B类。imp中的类使用util中的C类。我被迫将A、B和C类设置为public,但我不希望它们暴露给我的库用户。虽然我的库是开源的,但最小化的API更容易理解。
有没有什么方法可以解决这个问题?

如果AB不是公共的,那么api中的类无法访问它们。 - noamtm
@EpicPandaForce 请详细说明。 - noamtm
也许您想通过引入额外的接口来解耦您的包。例如,A 可以具有包可见性,同时实现 api 所需的公共接口 Aalizable - SME_Dev
基本上,如果你想要隐藏它们,那么把它们放在同一个包中,并使用包可见性而不是公共可见性。 - EpicPandaForce
@SME_Dev Aalizable 将会对库的用户可见,但实际上它只是一个实现细节。 - noamtm
显示剩余2条评论
2个回答

6
在Java 9中,您可以控制从JAR中导出哪些包。这样,您可以使它们公开,但其他人无法使用。
目前您无法控制此功能。您只能将所有内容放在一个包中,或依靠文档明确说明不应该使用它们。例如:jdk.internal 假定除JDK之外的任何人都不应该使用这些内容。

1
在这种情况下,创建一个注释会有意义吗?public @interface Internal {},然后将其应用于不应由客户端使用的公共和受保护的类。 - noamtm
1
或者相反,一个@PublicAPI注解。 - noamtm

0

你不能在其他包中使用私有类。相反,该类可以被公开,并且方法和变量可以被保护。因此,在这种情况下,类可以被扩展到需要它们的地方,并且只有扩展它的子类才能访问类中的内容。


你不能在其他包中使用私有类,除非该类实现了可见接口。例如,可以考虑工厂模式。方法和变量可以被设置为受保护的,因为客户端也可以创建子类并且这些内容对于库外部是可见的。 - SME_Dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接