Java FindBugs有争议的描述

Java FindBugs有争议的描述,java,equals,findbugs,Java,Equals,Findbugs,是我理解错了,还是描述错了 等于检查不相容性 操作数 (等式检查操作数与此操作数不兼容) 此方法正在检查以查看 如果论点是不相容的 类型(即,既不是 类的超类型或子类型 它定义了equals方法)。对于 例如,Foo类可能有一个 equals方法,该方法如下所示: 这被认为是一种不好的做法,因为它使人很难接受 实现一个equals方法 对称的和可传递的。没有 那些属性,非常出乎意料 行为是可能的 发件人: 描述中说Foo类可能有这样一个equals方法,然后说“这被认为是不好的做法”。我没有找到

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

等于检查不相容性 操作数 (等式检查操作数与此操作数不兼容)

此方法正在检查以查看 如果论点是不相容的 类型(即,既不是 类的超类型或子类型 它定义了equals方法)。对于 例如,Foo类可能有一个 equals方法,该方法如下所示:

这被认为是一种不好的做法,因为它使人很难接受 实现一个equals方法 对称的和可传递的。没有 那些属性,非常出乎意料 行为是可能的

发件人:

描述中说Foo类可能有这样一个equals方法,然后说“这被认为是不好的做法”。我没有找到“正确的方法”

以下方法应该如何正确

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

当FindBugs的描述说某某“可能是这样”时,他们并不是说这是一种可接受的做法,而是说这是一种假设的情况,这将导致有问题的警告

您不应该说您的对象等于某个DefaultTableModel,因为无法强制该关系的自反性。这意味着

DefaultTableModel dtm = new DefaultTableModel(...);
YourObject foo = new YourObject(dtm);
foo.equals(dtm); // true
dtm.equals(foo); // false!

当FindBugs的描述说某某“可能是这样”时,他们并不是说这是一种可接受的做法,而是说这是一种假设的情况,这将导致有问题的警告

您不应该说您的对象等于某个DefaultTableModel,因为无法强制该关系的自反性。这意味着

DefaultTableModel dtm = new DefaultTableModel(...);
YourObject foo = new YourObject(dtm);
foo.equals(dtm); // true
dtm.equals(foo); // false!

该方法的第一个版本(FindBugs抱怨)的问题是它不对称

如果您有一个Foo对象
f
,其中
f.equals(“someName”)
true
,那么对称表示
“someName.”equals(f)
也应为
true
。但是您无法实现这一点:
“someName”。对于任何非字符串的参数,equals(…)
将返回
false


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

该方法的第一个版本(FindBugs抱怨)的问题是它不对称

如果您有一个Foo对象
f
,其中
f.equals(“someName”)
true
,那么对称表示
“someName.”equals(f)
也应为
true
。但是您无法实现这一点:
“someName”。对于任何非字符串的参数,equals(…)
将返回
false


该方法的第二个版本也是错误的,因为您认为
Foo
实例可以等于
DefaultTableModel
实例。。。但不是另一个
Foo
实例。这意味着
Foo
实例不能等于自身,因此
equals
不是自反的。此外,
模型
标识符是什么还不清楚…

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

实现的不寻常之处在于将字段“模型”与完整的对象“obj”进行比较。通常,您应该在检查自身的每个字段是否都属于同一类或子类后,将其与另一个对象的每个字段进行比较。

是的,上面已经解释并标记为正确答案。)是的,上面已经解释并标记为正确答案……)我认为你把及物动词和对称词混淆了。。。我一定累了。。。修正了。我认为你把及物和对称混淆了。。。我一定累了。。。固定的