1

私はそれを間違って理解していますか、それとも説明が間違っていますか?

互換性のないオペランドのチェックに等しい(EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS)

このequalsメソッドは、引数が互換性のない型(つまり、equalsメソッドを定義するクラスのスーパータイプでもサブタイプでもないクラス)であるかどうかを確認しています。たとえば、Fooクラスには次のようなequalsメソッドがあります。

public boolean equals(Object o) {
  if (o instanceof Foo)
    return name.equals(((Foo)o).name);
  else if (o instanceof String)
    return name.equals(o);
  else return false;

これは、対称で推移的なequalsメソッドの実装を非常に困難にするため、悪い習慣と見なされます。これらのプロパティがないと、非常に予期しない動作が発生する可能性があります。

差出人:http ://findbugs.sourceforge.net/bugDescriptions.html#EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS

説明には、Fooクラスにはそのようなequalsメソッドがある可能性があり、その後、「これは悪い習慣と見なされます」と書かれています。私は「正しい道」を得ていません。

次の方法はどのように正しくあるべきですか?

@Override
public boolean equals(Object obj) {
if (obj instanceof DefaultTableModel)
    return model.equals((DefaultTableModel)obj);
else
    return false;
}
4

3 に答える 3

4

FindBugsの説明に、そのような「そうかもしれない」と書かれている場合、それは許容できる慣行ではなく、問題の警告につながる架空の状況であると言っています。

その関係の再帰性を強制する方法がないため、オブジェクトがDefaultTableModelと等しいと言うべきではありません。これは、

DefaultTableModel dtm = new DefaultTableModel(...);
YourObject foo = new YourObject(dtm);
foo.equals(dtm); // true
dtm.equals(foo); // false!
于 2010-03-22T02:48:44.170 に答える
3

メソッドの最初のバージョン(FindBugsが文句を言う)の問題は、それが対称的ではないということです。

であるFooオブジェクトfがあるf.equals("someName")場合true、対称性はそれ"someName".equals(f)もである必要があることを示しますtrue。しかし、それを実装する方法はありません。文字列ではないパラメータ"someName".equals(...)に対して返されます。false

メソッドの2番目のバージョンも間違っています。これは、インスタンスがインスタンスと等しくなる可能性があるが、別Fooのインスタンスと等しくなることはできないと言っているためです。つまり、インスタンスはそれ自体と等しくなることはできず、したがって反射的ではありません。その上、識別子が何であるかは明確ではありません...DefaultTableModelFooFooequalsmodel

于 2010-03-22T03:21:07.363 に答える
0

実装の珍しい部分は、フィールド「model」を完全なオブジェクト「obj」と比較することです。通常、自己の各フィールドを他のオブジェクトの各フィールドと比較する必要があります。これらが両方とも同じクラスまたはサブクラスであることを確認した後です。

于 2010-06-03T06:33:58.243 に答える