为什么 class 的实例可以访问其自身类型的另一个实例的私有字段?

Why can an instance of a class access private fields of another instance of its own type?

Java 中 class 的实例可以访问其自身类型的不同实例的私有字段,例如以下清单:

public class Foo {
  private int secret;
  public void bar(final Foo foo) {
    foo.secret = 100;
  }
}

这种语义的论点是什么(在设计语言时)?

首先你要问“为什么要有私有字段?”

私有字段主要用于封装:class 的使用者不必知道 class 实现的内部结构,事实上,这些内部结构应该被主动隐藏起来消费者。否则,如果用户依赖于这些内部结构,那么实施者将被迫支持它们或破坏向后兼容性。换句话说,它保护了 class:

的用户和设计者
  • 用户不会因为实施更改而破坏他们的代码
  • 设计者不必永远保持实现细节特性不变

但是 class 不需要对其自身进行保护;它不需要担心它的代码的一部分发生变化,但另一部分(使用第一位)不能改变的情况。向后兼容性不是问题,因为 class 是作为单个原子代码块开发和部署的。换句话说,以上两种保护都不需要。

由于不需要保护字段,而且经常需要查看它们(例如,比较两个对象是否相等),因此它们在 class.

您可以 copy/compare 值而无需额外的 getter 并更改字段而无需 setter。不知道在 JVM 中是否以任何方式优化了这种简单的方法调用,但如果没有,则会产生一些开销。

有人可能会认为保持这样的 "open" 访问权限可能会导致一些安全问题,但是在实现 class 时,您提供了操作这些变量的所有方法。没有人可以从 classes 扩展这个 class 来改变它们。事实上,它们仍然是私有的 - 只能通过您的代码访问。

还请记住,从逻辑上讲,class 通常注定要做一份工作。共享一些信息和简化访问可能是有益的,尤其是在产生大量实例的情况下。在处理需要更多控制的情况时,总是可以使用包访问修饰符(在某种意义上更多 "private"...)或使用 singleton/factory 模式限制实例数。

private 字段是为了告诉其他程序员不要乱用它。

据推测,在单个 class 中工作的每个人都知道所有变量的作用。 private 字段不会向您隐藏您自己的代码,只是从外部隐藏。