17

回应你最久的编程假设是什么,结果证明是不正确的?问题,错误的假设之一是:

私有成员变量是实例私有的,而不是类私有的。

链接

我听不懂他在说什么,谁能用一个例子来解释什么是错/对?

4

3 回答 3

35
public class Example {
  private int a;

  public int getOtherA(Example other) {
    return other.a;
  }
}

像这样。如您所见,私有并不能保护实例成员不被另一个实例访问。

顺便说一句,只要你小心一点,这并不全是坏事。如果 private 不能像上面的例子那样工作,那么编写 equals() 和其他这样的方法会很麻烦。

于 2009-08-31T13:37:44.347 回答
3

当您无法访问另一个对象的私有字段时,这相当于Michael Borgwardt 的回答:

public class MutableInteger {
    private int value;

    // Lots of stuff goes here

    public boolean equals(Object o) {
        if(!(o instanceof MutableInteger)){ return false; }
        MutableInteger other = (MutableInteger) o;
        return other.valueEquals(this.value); // <------------
    }

    @Override // This method would probably also be declared in an interface
    public boolean valueEquals(int oValue) {
        return this.value == oValue;
    }
}

现在这对 Ruby 程序员来说很熟悉,但我已经在 J​​ava 中这样做了一段时间。我不想依赖对另一个对象的私有字段的访问。请记住,另一个对象可能属于一个子类,该子类可以将值存储在不同的对象字段中,或者存储在文件或数据库等中。

于 2009-08-31T14:09:27.147 回答
2

示例代码(Java):

public class MutableInteger {
    private int value;

    // Lots of stuff goes here

    public boolean equals(Object o) {
        if(!(o instanceof MutableInteger)){ return false; }
        MutableInteger other = (MutableInteger) o;
        return this.value == other.value; // <------------
    }
}

如果假设“私有成员变量对实例是私有的”是正确的,则标记的行将导致编译器错误,因为该字段是私有的,并且是与正在调用other.value其方法的对象不同的对象的一部分。equals()

但是由于在 Java(和大多数其他具有可见性概念的语言)中, private可见性是每个类的,因此允许对 的所有代码访问该字段MutableInteger,而与用于调用它的实例无关。

于 2009-08-31T13:42:21.613 回答