我喜欢使用各种语言中的访问控制,但我发现在Java中,我几乎从未(如果有的话)使用包级私有访问修饰符(或缺乏它)。
我知道内部类可以是private
、protected
或package-private
,但外部类只能是package-private
或public
。为什么外部类可以是package-private
而不是protected
?限制类/方法/字段只在整个包中可见而不是子类的好处是什么?
我喜欢使用各种语言中的访问控制,但我发现在Java中,我几乎从未(如果有的话)使用包级私有访问修饰符(或缺乏它)。
我知道内部类可以是private
、protected
或package-private
,但外部类只能是package-private
或public
。为什么外部类可以是package-private
而不是protected
?限制类/方法/字段只在整个包中可见而不是子类的好处是什么?
当我想要隐藏包外用户(和其他类)无需了解的实现细节时,我会使用包私有
的类和方法。
例如,如果我有一个接口和一个工厂类用于创建该接口的实例,我可能会将实现类作为单独的文件,但标记为包私有,这样其他人就不能使用它,也不会在JavaDoc中混杂(如果javadoc设置为仅显示公共内容)。
如果密封jar文件,则包私有方法还可以帮助限制谁可以访问这些方法。 如果方法是公共或受保护的,则子类仍然可以看到并调用该方法,即使它位于不同的包中。(未封装的JAR允许任何人制作您的包中的类,因此他们将获得对包私有或受保护方法的访问权限)