回应你最久的编程假设是什么,结果证明是不正确的?问题,错误的假设之一是:
私有成员变量是实例私有的,而不是类私有的。
(链接)
我听不懂他在说什么,谁能用一个例子来解释什么是错/对?
public class Example {
private int a;
public int getOtherA(Example other) {
return other.a;
}
}
像这样。如您所见,私有并不能保护实例成员不被另一个实例访问。
顺便说一句,只要你小心一点,这并不全是坏事。如果 private 不能像上面的例子那样工作,那么编写 equals() 和其他这样的方法会很麻烦。
当您无法访问另一个对象的私有字段时,这相当于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 程序员来说很熟悉,但我已经在 Java 中这样做了一段时间。我不想依赖对另一个对象的私有字段的访问。请记住,另一个对象可能属于一个子类,该子类可以将值存储在不同的对象字段中,或者存储在文件或数据库等中。
示例代码(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
,而与用于调用它的实例无关。