我啥时候在 Java 中使用包私有? [复制]

Posted

技术标签:

【中文标题】我啥时候在 Java 中使用包私有? [复制]【英文标题】:When would I use package-private in Java? [duplicate]我什么时候在 Java 中使用包私有? [复制] 【发布时间】:2013-08-25 07:56:11 【问题描述】:

我喜欢任何语言的访问控制,但我发现在 Java 中我几乎从不(如果有的话)使用package-private 访问修饰符(或不使用)。

我意识到内部类可以是privateprotectedpackage-private,但外部类只能是package-privatepublic。为什么外部类可以是package-private 而不是protected?限制类/方法/字段只能被整个包看到,而不是子类有什么好处?

【问题讨论】:

【参考方案1】:

当我想对包外的用户(和其他类)隐藏实现细节时,我使用package-private 类和方法。

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

如果你密封你的 jar 文件,包私有方法也可以帮助限制谁可以访问这些方法。如果一个方法是公共的或受保护的,即使它在不同的包中,子类仍然可以看到和调用该方法。 (未密封的 jar 允许任何人在您的包中创建类,以便他们可以访问包私有或受保护的方法)

【讨论】:

【参考方案2】:

在许多情况下,同一个包中的对等类具有相同的作者,因此他知道这些类的内部工作方式,或者换句话说,他知道这些类的封装逻辑。因此,他可以确保类之间的包私有访问遵循被访问类的封装逻辑,并且这些访问不会破坏任何内容。

这些直接访问通常对优化和减少源代码量很有用。

对于为什么外部类可能是包私有但不受保护的问题部分,我没有答案。

【讨论】:

以上是关于我啥时候在 Java 中使用包私有? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中,在内存方面,使用私有与公共是不是有区别? [复制]

如何在 Java 中的包私有声明中破坏封装

在Java中,如果这样写,为啥私有数据成员可以在类外部访问? [复制]

`go install`-ing私有包时如何输入git repo用户名? [复制]

Java中“this”或私有对象的同步? [复制]

我啥时候应该在 JavaScript 中使用 delete vs 将元素设置为 null? [复制]