簡體   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