在Java中,什么情况下会使用包私有(package-private)?

6

我喜欢使用各种语言中的访问控制,但我发现在Java中,我几乎从未(如果有的话)使用包级私有访问修饰符(或缺乏它)。

我知道内部类可以是privateprotectedpackage-private,但外部类只能是package-privatepublic。为什么外部类可以是package-private而不是protected?限制类/方法/字段只在整个包中可见而不是子类的好处是什么?

2个回答

13

当我想要隐藏包外用户(和其他类)无需了解的实现细节时,我会使用包私有的类和方法。

例如,如果我有一个接口和一个工厂类用于创建该接口的实例,我可能会将实现类作为单独的文件,但标记为包私有,这样其他人就不能使用它,也不会在JavaDoc中混杂(如果javadoc设置为仅显示公共内容)。

如果密封jar文件,则包私有方法还可以帮助限制谁可以访问这些方法。 如果方法是公共或受保护的,则子类仍然可以看到并调用该方法,即使它位于不同的包中。(未封装的JAR允许任何人制作您的包中的类,因此他们将获得对包私有或受保护方法的访问权限)


2
在许多情况下,同一包中的对等类由同一作者编写,因此他了解这些类的内部工作方式,或者换句话说,他了解这些类的封装逻辑。因此,他可以确保类之间的包内访问遵循所访问类的封装逻辑,并且这些访问不会破坏任何内容。
这些直接访问通常用于优化和减少源代码量。
至于为什么外部类可能是包级私有的问题,但不能是受保护的,我没有答案。

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