2010-12-23 42 views
0

我已經等於此方法,但Findbugs報告錯誤,有什麼想法?奇怪的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)檢查操作數是一個字符串

+0

findbugs報告的錯誤是什麼? – 2010-12-23 05:56:40

+0

它顯示什麼錯誤信息?它可能會顯示,如果你沒有重寫`hashCode()` – 2010-12-23 05:56:53

回答

7

你實現平等爲您MyClass將打破的equals-contract至少symmetric-和反身性:

對稱:

對於任何非空 參考值x和y,x.equals(y) 應該返回tru當且僅當 y.equals(x)返回true。

你的情況:

MyClass A例如使用值= 「一」: A.equals("a")將是真實的,但"a".equals(A)是假的。這違反了對稱性。

自反:

對於任何非空引用值x,x.equals(x)的應返回true。

但您的實現將返回false爲

A.equals(A) 

但必須返回true。

等等

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

據我瞭解FindBugs的點,潛在的錯誤。

+0

爲什麼有必要?不會`String.equals`會這樣做嗎? – fastcodejava 2010-12-23 06:00:39

4

你的平等執行肯定很奇怪。

原因之一,它看起來非常像其違反

a.equals(a) == true 

===更新的要求,響應評論===

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

當您將對象放入集合或貼圖時,這種行爲很重要。如果沒有提到的屬性,你會得到你可以添加一個實例到一個Set的過程行爲,並且隨後調用包含一個完全相同的對象作爲參數的集合會導致false。

===響應您的改變的問題===

既然你檢查操作數是一個字符串,但你的類不是字符串的一個子類,你的類的實例永遠另一個更新根據你的平等定義,它等於自己。正如另一個答案所述,對稱性將被打破。

這可能是有用的,以及: http://findbugs.sourceforge.net/bugDescriptions.html#EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS