equals方法覆盖超类中的equals,可能不是对称的

时间:2011-06-29 09:35:43

标签: java

对于我的“平等”方法,我有以下Findbugs错误,

  

此类定义equals方法   覆盖a中的equals方法   超类。两者都等于方法   方法在中使用instanceof   确定是否有两个物体   是平等的。这充满了危险,   因为平等是重要的   方法是对称的(换句话说,   a.equals(b)== b.equals(a))。如果B是   A的子类型和A的等于方法   检查参数是否为   instanceof A和B的equals方法   检查参数是否为   实例B,很有可能   由...定义的等价关系   这些方法不对称。

我无法在此处发布代码以进行安全违规。请告诉我这是什么错误?

3 个答案:

答案 0 :(得分:10)

它表示equals()的合同意味着a.equals(b)当且仅当b.equals(a)为真时才为真。

如果B延伸A,则A.equals(Object obj)中你可能会有

if !(obj instanceof A) return false;

并在B.equals(Object obj)中有

if !(obj instanceof B) return false;

这是不对称性:B的实例使(b instanceof A)为真,而A的实例使(a instanceof B)为假。因此,这意味着风险比a.equals(b)为真,b.equals(a)为假。

答案 1 :(得分:2)

您可以使用类似的结构来防止此错误:

public boolean equals(final Object obj)
{
   if (obj == null || getClass() != obj.getClass())
   {
      return false;
   } 
// ... 

而不是

public boolean equals(final Object obj)
{
   if (!(o instanceof UniversalIDDefinition))
   {
      return false;
   }   
// ...

答案 2 :(得分:0)

您也可以使用它:

if (obj == null || !MyClass.class.isAssignableFrom(obj.getClass())) {
    return false;
}