![](/img/trans.png)
[英]FindBugs: overridden equals() causing static code analysis error EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS
[英]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.