为什么 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
字段不会向您隐藏您自己的代码,只是从外部隐藏。
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
字段不会向您隐藏您自己的代码,只是从外部隐藏。