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

时间:2015-06-02 19:00:32

标签: java semantics dsl

Java中的类实例可以访问其自己类型的不同实例的私有字段,例如在以下列表中:

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

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

3 个答案:

答案 0 :(得分:14)

嗯,首先你要问"为什么要有私人领域?"

私有字段主要用于封装:一个类的用户不应该知道该类的内部结构'实现。事实上,他们不应该知道,因为如果他们依赖于那些细节,那么实施者将被迫支持它们或者破坏向后兼容性。换句话说,它保护了类的用户和设计者:

  • 保护用户免受执行更改破坏她的代码
  • 设计师不必永远保持实现细节功能不变

但是一个班级不需要保护自己;它不需要担心其代码的一位改变的情况,但另一位(使用第一位)不能改变。向后兼容性不是问题,因为该类是作为单个原子代码块开发的。换句话说,上述保护措施都不需要。

由于不需要保护字段,并且因为它们经常需要看到它们(例如,比较两个对象是否相等),它们在课堂上可见

答案 1 :(得分:4)

private字段旨在告诉其他程序员不要弄乱它。

据推测,在一个班级工作的每个人都知道所有变量的作用。 private字段无法从外部隐藏您自己的代码。

答案 2 :(得分:1)

您可以在没有其他getter的情况下复制/比较值,也可以在没有setter的情况下更改字段不知道在JVM中这样的简单方法调用是否以任何方式进行了优化,但如果没有,则会产生一些开销。

有人可能认为保持这种“开放”访问可能会导致一些安全问题,但在实现类时,您提供了操作这些变量的所有方法。没有人可以从扩展此类的类中更改它们。事实上,它们仍然是私密的 - 只能从您的代码中访问。

还要记住,逻辑上一个班往往注定要做一份工作。共享一些信息和简化访问可能是有益的,尤其是在生成大量实例的情况下。在处理需要更多控制的情况时,可以始终使用包访问修饰符(在某种意义上更“私有”......)或使用单例/工厂模式限制实例计数。