繁体   English   中英

等于的奇怪Findbugs错误

[英]Strange Findbugs error with equals

我等于这个方法,但是Findbugs报告错误,知道吗?

@Override
public boolean equals(final Object obj) {
    return obj instanceof String && this.value != null  
                              && this.value.equals(obj);      // this.value is a String
}

错误是:

Myclass.equals(Object)检查操作数是否为字符串

您为MyClass实现的equals至少会破坏equals-contract的对称和自反属性:

对称的:

对于任何非空参考值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true。

在您的情况下:

例如, MyClass A的值为=“ a”: A.equals("a")为true,但是"a".equals(A)为false。 这违反了对称属性。

反身:

对于任何非空参考值x,x.equals(x)应该返回true。

但是您的实现将为返回false

A.equals(A) 

但必须返回true。

等等。

您的平等实施肯定很奇怪。

对于它,它看起来非常违反其要求

a.equals(a) == true

===更新以回应评论===

这是平等合同的一部分: http : //download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#equals%28java.lang.Object%29

当您将对象放入集合或地图时,这种行为很重要。 没有提到的属性,您将得到奇怪的行为,可以将实例添加到Set中,然后调用该set上包含与参数完全相同的对象的对象将导致false。

===针对您更改的问题的另一种更新===

由于您检查操作数是否为String,但您的类不是String的子类,因此根据您对equals的定义,该类的实例永远不会等于其自身。 同样如另一个答案所述,对称性将被破坏。

这也可能会有所帮助: http : //findbugs.sourceforge.net/bugDescriptions.html#EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS

 @Override
 public boolean equals(final Object obj) {
    return (obj instanceof YourClass) && (this.value.equals(((YourClass)obj).value));      // this.value is a String
}

据我了解,Findbugs指出了潜在的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM