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

问题描述 投票:0回答:4

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

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

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

java semantics dsl
4个回答
18
投票

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

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

  • 用户受到保护,不会因实施更改而破坏其代码
  • 设计人员不必永远保持实现细节功能不变

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

由于不需要保护字段,并且经常需要查看它们(例如,比较两个对象是否相等),因此它们在类中可见。


6
投票

private
字段的目的是告诉其他程序员不要搞乱它。

想必,在单个类中工作的每个人都知道所有变量的作用。

private
字段不会对您隐藏您自己的代码,只是对外部隐藏。


1
投票

您可以复制/比较值而无需额外的 getter 并更改字段而无需 setter。不知道 JVM 中是否对这种简单的方法调用进行了优化,但如果没有,则会产生一些开销。

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

还要记住,从逻辑上讲,一个类通常注定要做一项工作。共享一些信息并方便访问可能是有益的,特别是在生成大量实例的情况下。在处理需要更多控制的情况时,总是可以使用包访问修饰符(从某种意义上来说,这更“私有”......)或使用单例/工厂模式限制实例数量。


0
投票

要添加其他正确且已接受的答案,此页面在此主题/问题中包含有用的信息:

新的 Java 程序员可能会问一个 Alpha 对象是否可以访问另一个 Alpha 对象的私有成员。以下示例对此进行了说明。假设 Alpha 类包含一个实例方法,该方法根据 iamprivate 变量将当前 Alpha 对象 (this) 与另一个对象进行比较:

class Alpha {
    private int iamprivate;
    boolean isEqualTo(Alpha anotherAlpha) {
        if (this.iamprivate == anotherAlpha.iamprivate)
            return true;
        else
            return false;
    }
}

这是完全合法的。同一类型的对象可以访问彼此的私有成员。这是因为访问限制适用于类或类型级别(类的所有实例),而不是对象级别(类的特定实例)。

© www.soinside.com 2019 - 2024. All rights reserved.