12

私はここで無知です...

 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()

定義へのリンク

これを修正する方法がわかりません。

4

5 に答える 5

17

このエラーは、オーバーライドequalsしていない(したがって、 fromForeignKeyConstraintを継承していない)ため、(のjavadocから)次のことが当てはまらないことを意味します。equalsObjectcompareTo

強くお勧めしますが、厳密には必須ではありません(x.compareTo(y)==0) == (x.equals(y))。一般的に、Comparableインターフェースを実装し、この条件に違反するクラスは、この事実を明確に示す必要があります。推奨される言語は「注:このクラスには、equalsと矛盾する自然な順序があります」です。

FindBugsチェックを修正するには、一般的に当てはまる場合はequals-と-をオーバーライドします(または、このクラスのチェックを除外し、提案されたメモを使用して、クラスがこの条件に違反していることを文書化します)。hashCode

于 2010-04-09T16:30:56.093 に答える
6

これは、compareTo()とequals()が一致しない可能性があることを示しています。そして、彼らは本当に、決して反対するべきではありません。

equals()メソッドはjava.lang.Objectから継承されており、デフォルトでは2つのオブジェクトが同じインスタンスであるかどうかを確認します。compareToメソッドは、tableNameとfkFieldNameに基づいてオブジェクトを比較しています。したがって、compareToが2つのオブジェクトが同じである(tableNameとfkFieldNameが一致するため)と述べているが、等しいとは異なる(インスタンスが異なるため)という状況に陥る可能性があります。

compareToに依存し、一貫性があることに等しいJavaAPIがいくつかあります。これはJava言語の一部であり、コア言語コントラクトと見なされます。理想的には、equals(およびハッシュコード)メソッドを実装して、tableNameとfkFieldNameに基づいて等しいかどうかをチェックします。

于 2010-04-09T16:32:26.573 に答える
4

equals()メソッドを実装することで解決できます。FindBugsの定義を参照してください。

「一般に、compareToの値は、equalsがtrueを返す場合にのみゼロを返す必要があります。これに違反すると、PriorityQueueなどのクラスで奇妙で予測できない障害が発生します。」

「強くお勧めしますが、(x.compareTo(y)== 0)==(x.equals(y))である必要はありません。」

もう1つの例はTreeSetです。これは、compareToを呼び出すことによって等価性チェックを実装し、equalsと矛盾するcompareTo実装は、TreeSetをSetインターフェースのコントラクトに違反させ、プログラムの誤動作につながる可能性があります。

于 2010-04-09T16:31:38.563 に答える
2

SqlFixer.ForeignKeyConstraintでもequalsメソッドをオーバーライドしてみましたか?

警告の根拠は、定義で述べられているように、compareToをオーバーライドして等しくない場合、奇妙なことが起こる可能性があるということだと思います。

詳細については、JoshuaBlochのEffectiveJava、2ndEditionをご覧ください。項目12では、Comparableの実装の詳細と、注意すべき点について詳しく説明します。

于 2010-04-09T16:31:24.833 に答える
1

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() {
  ...
}
于 2011-09-11T14:12:42.037 に答える