我喜欢任何语言的访问控制,但我发现在Java中我几乎从不(如果有的话)使用package-private访问修饰符(或缺少访问修饰符)。
我意识到内部类可以是private
,protected
或package-private
,但外部类只能是package-private
或public
。为什么外部类可以package-private
而不是protected
?限制整个包可以看到的类/方法/字段有什么好处,而不是子类?
答案 0 :(得分:13)
当我想隐藏包外的用户(和其他类)的实现细节时,我使用package-private
类和方法。
例如,如果我有一个接口和一个工厂类来创建该接口的实例,我可能将实现类作为一个单独的文件,但将其标记为package-private,以便其他人不能使用它,也不会使JavaDoc混乱(如果javadoc设置为仅显示公共状态。)
如果密封jar文件,package-private方法也可以帮助限制谁可以访问这些方法。如果方法是公共的或受保护的,则子类仍然可以查看并调用该方法,即使它位于不同的包中。 (未密封的jar允许任何人在你的包中创建类,以便他们可以访问包私有或受保护的方法)
答案 1 :(得分:2)
在许多情况下,同一个包中的对等类具有相同的作者,因此他知道这些类的内部方式,或者换句话说,他知道这些类的封装逻辑。因此,他可以确保类之间的包私有访问遵循所访问类的封装逻辑,并且这些访问不会破坏任何内容。
这些直接访问通常对优化和保持较小的源代码量很有用。
对于问题部分,为什么外部类可以是包私有,但不受保护,我没有答案。