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