Java FindBugs-如何解决EQ_比较使用对象等于

Java FindBugs-如何解决EQ_比较使用对象等于,java,findbugs,compareto,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.tab

我在这里不知所措

 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: }
1:私有静态类ForeignKeyConstraint实现可比较{
2:字符串表名;
3:字符串字段名;
4: 
5:公共内部比较(ForeignKeyo){
6:if(this.tableName.compareTo(o.tableName)==0){
7:返回此.fkFieldName.compareTo(o.fkFieldName);
8:        }
9:返回this.tableName.compareTo(o.tableName);
10:    }
11: }
在第6行中,我从FindBugs获得:
Bug:net.blabla.SqlFixer$ForeignKeyConstraint定义compareTo(SqlFixer$ForeignKeyConstraint)并使用Object.equals()


我不知道如何更正此错误。

此错误意味着您没有覆盖
ForeignKeyConstraint
中的
equals
(从而从
对象继承
equals
),因此以下内容不正确(来自的javadoc):

强烈建议但不严格要求
(x.compareTo(y)=0)=(x.equals(y))
。一般来说,任何实现可比较接口并违反此条件的类都应该清楚地指出这一事实。建议使用的语言是“注意:此类具有与equals不一致的自然顺序。”


要修复FindBugs检查,请重写
equals
-和
hashCode
-如果这是有意义的,通常是这样的(或者使用建议的注释排除对此类的检查并记录您的类违反了此条件)。

您是否也尝试过在SqlFixer.ForeignKeyConstraint中重写equals方法

我相信这个警告的基础是,正如定义中所说的,如果你忽略compareTo而不是equals,奇怪的事情就会发生


有关更多信息,请查看。第12项更深入地介绍了实施Comparable的细节和一些需要注意的事项

您可以通过实现equals()方法来解决它。请参阅FindBugs定义:

通常,当且仅当equals返回true时,compareTo的值应返回零。如果违反此规定,则PriorityQueue等类中会出现奇怪且不可预测的失败

强烈建议(x.compareTo(y)==0)=(x.equals(y)),但不是严格要求


另一个例子是树集。它通过调用compareTo来实现相等性检查,如果compareTo实现与equals不一致,则会使树集违反Set接口的约定,这可能会导致程序故障。

它告诉您compareTo()和equals()可能不一致。事实上,他们永远不应该不同意

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


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

Findbugs很满意:

public int compareTo(ForeignKeyConstraint o) {
    if (this.equals(o)) {
        return 0;
    } else if (this.tableName.equals(o.tableName)) {
        // fkFieldName must be different
        return this.fkFieldName.compareTo(o.fkFieldName);
    } else {
        // tableName must be different
        return this.tableName.compareTo(o.tableName);
    }
}

@Override
public equals() {
  ...
}

@Override
public int hashCode() {
  ...
}