[英]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()
我不知道如何糾正這個問題。
這個錯誤意味着你沒有覆蓋equals
在ForeignKeyConstraint
(並由此繼承了equals
的Object
),所以下面是不正確的(從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.