1

是我理解错了,还是描述错了?

Equals 检查不兼容的操作数 (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 抱怨)的问题是它不是对称的。

如果你有一个is的 Foo 对象f,那么对称性说它也应该是。但是您无法实现:将为任何不是字符串的参数返回。f.equals("someName")true"someName".equals(f)true"someName".equals(...)false

该方法的第二个版本也是错误的,因为您说一个Foo实例可以等于一个DefaultTableModel实例......但不能等于另一个Foo实例。这意味着一个Foo实例不能等于它自己,equals因此它不是自反的。此外,目前尚不清楚model标识符是什么......

于 2010-03-22T03:21:07.363 回答
0

您的实现中不寻常的部分是您将字段 "model"与完整的对象 "obj"进行比较。通常,在检查完它们都属于同一类或子类之后,您应该将 self 的每个字段与另一个对象的每个字段进行比较。

于 2010-06-03T06:33:58.243 回答