小弟我们爱分享-Obey the general contract when overriding equals
小弟我们爱分享-Obey the general contract when overriding equals
日期:2014-05-20 浏览次数:20849 次
我们爱分享---Obey the general contract when overriding equals 这两天热度有点低,也没什么好写的,就随便奉献上Effective Java中的一条规则 Obey the general contract when overriding equals
今天只讲其中的一个原则及其注意事项: symmetric: For any reference values x and y, x.equals(y) must return true if and only if y.equals(x) returns true. 可以称之为对称性或者交换性原则,即x.equals(y)返回true是y.equals(x)的充要条件。
理论大家会讲,但是在override的时候,大家很容易出错。
Java code
public class A {
public int x;
public boolean equals(Object obj) {
if (! (obj instanceof A)) {
return false;
}
A that = (A) obj;
return this.x == that.x;
}
}
public class B extends A {
public int y;
public boolean equals(Object obj) {
if (! (obj instanceof B)) {
return false;
}
B that = (B) obj;
return super.equals(obj) && this.y == that.y;
}
}
此时,无论B中间的equals方法如何调整,都会导致symmetric原则被破坏:
Java code
A a = new A();
B b = new B();
System.out.println(a.equals(b)); // true,B是A的子类,b当然是instanceof A,而且由于之比较a.x和b.x,所以true
System.out.println(b.equals(a)); // false,a不是B的实例