FindBugs - 如何解决EQ_COMPARETO_USE_OBJECT_EQUALS

Tri*_*ick 11 java findbugs compareto

我在这里一无所知......

 1: private static class ForeignKeyConstraint implements Comparable<ForeignKeyConstraint> {
 2: String tableName;
 3: String fkFieldName;
 4: 
 5: public int compareTo(ForeignKeyConstraint o) {
 6:    if (this.tableName.compareTo(o.tableName) == 0) {
 7:            return this.fkFieldName.compareTo(o.fkFieldName);
 8:        }
 9:        return this.tableName.compareTo(o.tableName);
10:    }
11: }
Run Code Online (Sandbox Code Playgroud)

在第6行,我从FindBugs得到: Bug: net.blabla.SqlFixer$ForeignKeyConstraint defines compareTo(SqlFixer$ForeignKeyConstraint) and uses Object.equals()

链接到定义

我不知道如何纠正这个问题.

Pas*_*ent 15

这个错误意味着你没有覆盖equalsForeignKeyConstraint(因而继承equalsObject),所以下面是不正确的(从javadoc中compareTo):

强烈建议,但并非严格要求(x.compareTo(y)==0) == (x.equals(y)).一般来说,任何实现Comparable接口并且违反此条件的类都应该清楚地表明这一事实.推荐的语言是"注意:此类具有与equals不一致的自然顺序."

要修复FindBugs检查,请覆盖equals- 并且hashCode- 如果通常情况有意义(或排除对此类和文档的检查,表明您的类使用建议的注释违反了此条件).


dan*_*aby 6

它告诉你 compareTo() 和 equals() 有可能不一致。他们应该,真的,永远不要不同意。

equals() 方法是从 java.lang.Object 继承的,它默认检查两个对象是否是同一个实例。您的 compareTo 方法是基于 tableName 和 fkFieldName 比较对象。因此,您可能会发现自己处于一种情况,其中 compareTo 声明两个对象相同(因为 tableName 和 fkFieldName 匹配),但 equals 声明它们不同(因为它们是不同的实例)。

有一些 Java API 依赖于 compareTo 和 equals 是一致的;这是 java 语言的一部分,被认为是核心语言契约。理想情况下,实现一个 equals(和 hashcode)方法来检查基于 tableName 和 fkFieldName 的相等性。