我喜欢将“更安全”的 equals() 定义作为模板:
/**
* Implement equals based on ${cursor}. <br />
* See {@link #compareTo(Object) compareTo}
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(final Object anObject)
{
boolean res = false;
if(anObject == null) { return false; }
if(anObject == this) { return true; }
if(anObject.getClass() == this.getClass())
{
res = this.compareTo(anObject) == 0;
}
return res;
}
为了确保始终避免Eq: equals 方法覆盖超类中的 equals 并且可能不是对称的( EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC
),其中:
此类定义了一个 equals 方法,该方法覆盖了超类中的 equals 方法。两种equals方法方法都使用instanceof来判断两个对象是否相等。
这充满了危险,因为 equals 方法是对称的(换句话说,a.equals(b) == b.equals(a)
)很重要。
如果B
是 的子类型A
, 和A
的 equals 方法检查参数是否为instanceof A
, 而 B 的 equals 方法检查参数是否为instanceof B
, 很可能这些方法定义的等价关系不是对称的。
这仅适用于实现的类Comparable
并允许:
- equals 的实现总是相同的;
- 所有比较逻辑仅位于一个位置(
compareTo()
函数);
- 遵守
Comparable#compareTo()
要求确保这一点的 javadoc (x.compareTo(y)==0) == (x.equals(y))
(强烈推荐,但并非严格要求)。