Java 的创建者做出了两个决定来指导他们如何设计 Java。一是性能是重中之重,不能因为太慢而被判定为不可用。另一个决定是,他们将针对 C 和 C++ 开发人员,并使 Java 与他们习惯的相似,以便更容易采用。
因此,Java 像 C++ 一样获得了公共、私有和受保护的访问权限。package-private 出现在哪里以及为什么它是默认值尚不清楚。他们可能假设开发人员希望直接访问变量以节省方法调用开销。很久以前,我和 Marimba 的专业服务人员一起做一个项目,我们有机会研究了一些实现代码,这些代码是由很多包私有成员编写的。当我问为什么解释是为了表现时。这是在 JIT 之类的优化之前,因此可能有人担心使用访问器方法获取常用超类成员可能会太慢。另一方面,这可能是一种风格偏好,或者他们正在使用更自由的方法作为不断发展的设计的一部分,也许将 package-private 设置为默认值的想法是应该期待这种自由。(根据我读过的任何其他代码判断,这不是什么。)它是由 Jonathon Payne 和 Arthur Van Hoff 编写的代码,因此专业服务人员可能没有了解真正的原因。
詹姆斯·高斯林(James Gosling )在一次采访中谈到了他的原因:
......我早期想做的一件事是正式设置并用语言获得一些东西。您知道在 JavaBeans 中如何编写 setter 和 getter 方法的这种约定吗?但当时我对开发人员进行了一系列调查,关于他们是否希望这个存在。一般人会说,“天哪!”
所以我没有这样做。但我想回想起来,我不应该听他们的。我应该做的。因为,我的意思是 Beans 基本上是在我本来想做的这个设施上分层的,但 Beans 是事后才做的。
而且因为它是作为命名约定分层的,所以有些东西不能很好地结合在一起。因此,例如,将实例变量的默认保护设为私有会很有意义。然后是 getter 和 setter,系统会在更深层次上知道它们,使它们要么公开要么打包。
风格演变的方向是更喜欢将实例变量设为私有,并在需要时通过 getter 公开它们。您可以指定私有访问修饰符,如下所示:
private int humidity;
然后变量对子类不可见。