代码之家  ›  专栏  ›  技术社区  ›  Trick

FindBugs-如何求解EQ\u COMPARETO\u USE\u OBJECT\u EQUALS

  •  11
  • Trick  · 技术社区  · 16 年前

    我在这里不知所措。。。

     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: }
    

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

    Link to definition

    我不知道怎么纠正这个。

    5 回复  |  直到 11 年前
        1
  •  17
  •   Pascal Thivent    16 年前

    这个错误意味着你没有重写 equals 在里面 ForeignKeyConstraint (从而继承了 等于 Object )所以以下是不正确的(来自 compareTo

    强烈建议但并非严格要求 (x.compareTo(y)==0) == (x.equals(y))

    要修复FindBugs检查,请重写 等于 -以及 hashCode -如果这样做有意义(或者使用建议的注释排除对此类和文档的检查,说明您的类违反了此条件)。

        2
  •  6
  •   dannywartnaby    16 年前

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

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

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

        3
  •  4
  •   Christian Semrau Louis Wasserman    16 年前

    一般来说,当且仅当equals返回true时,compareTo的值才应返回零。如果违反了这一点,则在PriorityQueue之类的类中会发生奇怪且不可预测的故障。”

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

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

        4
  •  2
  •   jnt30    16 年前

    在SqlFixer.ForeignKeyConstraint中也尝试过重写equals方法吗?

    我相信这个警告的基础是,如定义中所述,如果你覆盖compareTo而不是equals,奇怪的事情就会发生。

    有关更多信息,请访问 Joshua Bloch's Effective Java, 2nd Edition . 第12项更深入地讨论了实现可比性的细节和一些需要注意的事项。

        5
  •  1
  •   r2d2    14 年前

    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() {
      ...
    }