簡體   English   中英

FindBugs - 如何解決EQ_COMPARETO_USE_OBJECT_EQUALS

[英]FindBugs - how to solve EQ_COMPARETO_USE_OBJECT_EQUALS

我在這里一無所知......

 1: private static class ForeignKeyConstraint implements Comparable<ForeignKeyConstraint> {
 2: String tableName;
 3: String fkFieldName;
 4: 
 5: public int compareTo(ForeignKeyConstraint o) {
 6:    if (this.tableName.compareTo(o.tableName) == 0) {
 7:            return this.fkFieldName.compareTo(o.fkFieldName);
 8:        }
 9:        return this.tableName.compareTo(o.tableName);
10:    }
11: }

在第6行我從FindBugs得到: Bug: net.blabla.SqlFixer$ForeignKeyConstraint defines compareTo(SqlFixer$ForeignKeyConstraint) and uses Object.equals()

鏈接到定義

我不知道如何糾正這個問題。

這個錯誤意味着你沒有覆蓋equalsForeignKeyConstraint (並由此繼承了equalsObject ),所以下面是不正確的(從javadoc中compareTo ):

強烈建議,但並非嚴格要求(x.compareTo(y)==0) == (x.equals(y)) 一般來說,任何實現Comparable接口並且違反此條件的類都應該清楚地表明這一事實。 推薦的語言是“注意:此類具有與equals不一致的自然順序。”

要修復FindBugs檢查,請覆蓋equals - 和hashCode - 如果通常情況有意義(或排除對此類和文檔的檢查,表明您的類使用建議的注釋違反了此條件)。

您可以通過實現equals()方法來解決它。 請參閱FindBugs定義:

“通常,當且僅當equals返回true時,compareTo的值才應返回零。如果違反此規則,則會在諸如PriorityQueue之類的類中發生奇怪且不可預測的故障。”

“強烈建議,但並非嚴格要求(x.compareTo(y)== 0)==(x.equals(y))。”

另一個例子是TreeSet。 它通過調用compareTo來實現相等性檢查,並且與equals不一致的compareTo實現使得TreeSet違反了Set接口的約定,這可能導致程序故障。

它告訴你,compareTo()和equals()有可能不同意。 他們應該,實際上,從不反對。

equals()方法繼承自java.lang.Object,它默認檢查兩個對象是否是同一個實例 您的compareTo方法是比較對象基於tableName和fkFieldName。 所以你可能會發現自己處於這樣一種情況:compareTo聲明兩個對象是相同的(因為tableName和fkFieldName匹配),但是等於狀態它們是不同的(因為它們是不同的實例)。

有一些java API依賴於compareTo和equals是一致的; 這是java語言的一部分,被認為是核心語言契約。 理想情況下,實現一個equals(和hashcode)方法,以根據tableName和fkFieldName檢查是否相等。

您是否嘗試過在SqlFixer.ForeignKeyConstraint中重寫equals方法?

我相信警告的基礎是,如定義中所述,如果覆蓋compareTo而不是equals,則會發生奇怪的事情。

有關更多信息,請查看Joshua Bloch的Effective Java,第2版 第12項更深入地介紹了實施Comparable的內容和一些需要注意的事項。

Findbugs很滿意:

public int compareTo(ForeignKeyConstraint o) {
    if (this.equals(o)) {
        return 0;
    } else if (this.tableName.equals(o.tableName)) {
        // fkFieldName must be different
        return this.fkFieldName.compareTo(o.fkFieldName);
    } else {
        // tableName must be different
        return this.tableName.compareTo(o.tableName);
    }
}

@Override
public equals() {
  ...
}

@Override
public int hashCode() {
  ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM