最近,我在我的项目中讨论了关于包私有的可见性修改器。
“等等,什么是包私有在Java中?”有时也称为默认要么没有修饰符。 This is when class要么method doesn't have any modifier。 For example:
class SomeObject {
void doSomething() {
...
}
}
There are more details in Java tutorial.
除非非常具体的原因,否则不应该使用它。 您可以选择公开,私有或受保护。
到目前为止,我听到其他人的原因有很多:
- 但是我需要它来测试对象中的方法!但是最好限制访问对象! 只有相同包装的类才能访问它。我的图书馆有很多用户,想对他们隐藏实现细节!
But I need it to test method in my object!
不要仅仅为了测试那个非常重要的方法而进行私有打包。 这是我观察到的常见谬论之一。 人们倾向于以某种方式访问该私有逻辑,只是稍微放松一下,然后进行肮脏的测试! 有一个更好的办法。 首先,您需要了解,如果存在一些难以测试的隐藏功能,则您的设计可能存在问题。 这意味着它是重构的理想选择! 只需使用定义良好的API方法将该逻辑提取到内部类中并进行测试即可。
But It's better to restrict access to the Object as much as possible! It's being accessed only by same-package classes.
Oracle官方文档说: 使用对特定成员有意义的最严格的访问级别。 Use private unless you have a good reason not to. I am totally agree with this statement, just if we will drop 包私有不在此列表中。 如果一切都是公共/私有的,那么对于您的项目而言,生活将变得更加轻松。 大型代码库中最常见的重构之一是移动文件/类。 有很多包私有访问它将立即变得烦人。 那为什么不公开它们呢? At the end both 上市和包私有公开您的类的API。 无论在哪种情况下,它都受程序包的限制,它仍然是您必须关注的API。
When it still makes sense
- 测试。 不为测试代码编写访问修饰符是一种相对较新的趋势。 无论如何,修饰符都会给代码带来一些干扰,并且在测试中访问可见性与在生产代码中无关紧要。 少打字更好!您正在支持很多用户的图书馆。 除非您的库应与java8或更低版本兼容! 否则,我鼓励您在自己的库中使用JPMS(项目拼图),与之相比,这将使您更好地控制公开的API和内部实现包私有
因此,正如您在2019年(2020年很快!)所看到的,没有太多理由选择包私有能见度。