0

我有 equals 这种方法,但是 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的对称和自反属性:

对称:

对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应该返回 true。

在你的情况下:

MyClass A例如 value="a": A.equals("a")为真,但"a".equals(A)为假。这违反了对称性。

反身的:

对于任何非空引用值 x,x.equals(x) 应该返回 true。

但是您的实现将返回 false

A.equals(A) 

但必须返回 true。

等等。

于 2010-12-23T07:59:29.180 回答
4

您的 equals 实现肯定很奇怪。

一方面,它看起来很像它违反了要求

a.equals(a) == true

===根据评论更新===

这是equals合同的一部分:http: //download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#equals%28java.lang.Object%29

当您将对象放入 Set 或 Map 时,这种行为很重要。如果没有提到的属性,您将获得奇怪的行为,您可以将实例添加到 Set 中,然后使用与参数完全相同的对象调用 set 上的 contains 将导致 false。

===针对您更改的问题的另一个更新===

由于您检查了操作数是否为 String,但您的类不是 String 的子类,根据您对 equals 的定义,您的类的实例永远不会等于自身。正如另一个答案所述,对称性将被打破。

这也可能有帮助: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 回答