0

私はこの方法に匹敵しますが、Findbugsはエラーを報告しています、何か考えはありますか?

@Override
public boolean equals(final Object obj) {
    return obj instanceof String && this.value != null  
                              && this.value.equals(obj);      // this.value is a String
}

エラーは次のとおりです。

Myclass.equals(Object)オペランドが文字列であることを確認します

4

3 に答える 3

7

あなたのためのequalsの実装はMyClass、少なくともequals-contractの対称的および反射的特性を壊します:

対称:

null以外の参照値xおよびyの場合、y.equals(x)がtrueを返す場合に限り、x.equals(y)はtrueを返す必要があります。

あなたの場合:

MyClass Aたとえば、value = "a"の場合: A.equals("a")trueになりますが、"a".equals(A)falseになります。これは対称プロパティに違反します。

反射的:

null以外の参照値xの場合、x.equals(x)はtrueを返す必要があります。

ただし、実装はfalseを返します

A.equals(A) 

ただし、trueを返す必要があります。

等。

于 2010-12-23T07:59:29.180 に答える
4

equals の実装は確かに奇妙です。

1つは、要件に違反しているように見えます

a.equals(a) == true

=== コメントに応じて更新 ===

これは、等号の契約の一部です: http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#equals%28java.lang.Object%29

この種の動作は、オブジェクトをセットまたはマップに配置するときに重要です。上記のプロパティがないと、セットにインスタンスを追加できるという奇妙な動作が発生し、その後、引数とまったく同じオブジェクトを使用してセットで contains を呼び出すと、false になります。

=== 変更された質問に対する別の更新 ===

オペランドが文字列であることを確認しますが、クラスは文字列のサブクラスではないため、クラスのインスタンスは、等しい定義に従ってそれ自体と等しくなることはありません。また、別の回答で述べたように、対称性は破られます。

これも役立つかもしれません: http://findbugs.sourceforge.net/bugDescriptions.html#EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS

于 2010-12-23T06:00:56.170 に答える
2
 @Override
 public boolean equals(final Object obj) {
    return (obj instanceof YourClass) && (this.value.equals(((YourClass)obj).value));      // this.value is a String
}

私が理解しているように、Findbugsは潜在的なバグを指摘しています。

于 2010-12-23T05:58:13.050 に答える