FindBugs-どのように解決するのか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))
.一般的には、任意のクラスを実装する"相互に比較可能"で、に違反するこの条件を明確に表現すべきことであること。推奨されます。※このクラスは、自然順序付けることには反対等"
のFindBugsチェック、オーバーライド equals
● hashCode
-だことは、あってはならないことであるが、一般的に(または排除の確認のためにこのクラスの文書をご希望の侵害するこの条件の注)ができるようになりました。
他のヒント
あなたは、equals()メソッドを実装することによってそれを解決することができます。 FindBugsの定義を参照してください。
「とだけ等号が真ならば一般的に、のcompareToの値がゼロを返す必要があります。これに違反した場合は、奇妙な、予測できない障害が、このような優先度つきキューなどのクラスで発生します。」
"それを強くお勧めしますが、これは厳密には(x.compareTo(y)は== 0)==(x.equals(y)の)ことを必要とされていません。"
別の例は、TreeSetのです。これは、のcompareToを呼び出すことによって平等のチェックを実装し、equalsと矛盾しているのcompareToの実装では、TreeSetのは、プログラムの誤動作を引き起こす可能性がある設定されたインタフェース、契約に違反します。
反対する)(のcompareTo(の可能性がありますことを伝える)と等しくなります。そして、彼らは、本当に、反対してはいけません。
のequals()メソッドは、2つのオブジェクトが同じである場合、デフォルトのチェックで例を参照するためにどのjava.lang.Object上位から継承されています。あなたのcompareToメソッドは、オブジェクトがtableNameのとfkFieldNameに基づいています比較しています。潜在的にのcompareToは2つのオブジェクトが(tableNameのとfkFieldName試合ため)と同じであることを述べたが、(彼らしている別のインスタンスので)、彼らは異なっている状態に等しい状況で自分自身を見つけることができますあなたはとてもます。
のcompareToに依存し、一貫性であることと等しい数のJava APIがあります。これは、Java言語の一部であり、コア言語の契約と考えられています。理想的にはtableNameのとfkFieldNameに基づいて等価性をチェックするために等号(およびハッシュコード)メソッドを実装します。
またオメソッドは、equalsメソッドとの関連などSqlFixer.ForeignKeyConstraint?
この警告は、上記の定義と、不思議なことがたくさんできるようになればオーバーライドcompareToなequals.
詳細はチェック ジョシュア-ブロッホの効率的なJava、第2版.項12がより深いノウハウの実施並びにもできる。
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() {
...
}