compareTo方法中的问题

时间:2013-05-23 06:26:01

标签: java

在findbug中获取以下错误: EQ_COMPARETO_USE_OBJECT_EQUALS 以下是声明:

public int compareTo (OPVest vesting)
{
int c = this.Date.compareTo (vest.Date);
if (c != 0)
return c;

return this.Id - vest.segmentId;
}

请建议。

3 个答案:

答案 0 :(得分:1)

来自java Docs

  

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

覆盖equals - 和hashCode

你的代码中有一些错误

 public int compareTo (OPVest vesting)
   {
      int c = this.Date.compareTo (vesting.Date);
       if (c != 0)
         return c;

        return this.Id - vesting.segmentId;
   }

答案 1 :(得分:0)

基本上,FindBugs抱怨your compareTo() method is inconsistent with equals()

这一事实

只有当this等于操作数时,你的compareTo方法才会返回零。

可能的修复方法是:

  • 覆盖equals()hashCode()以符合compareTo()方法的效果。
  • 使用Comparator而非制作此类Comparable,并将其记录为与equals()
  • 不一致
  • 将此类记录为具有与equals()不一致的自然顺序。我想这不会让FindBugs感到高兴,但这是一种有效但又令人沮丧的可能性。

作为旁注:请确保如果您返回compareTo()的加法或减法结果,则无法获得溢出。

答案 2 :(得分:0)

通常,当且仅当compareTo()返回true时,equals()的值才应返回零。如果不满足此要求,可能会在其他Java类中导致不可预测的行为。由于默认equals()方法使用不同的条件来比较对象,因此如果您覆盖equals(),请务必覆盖compareTo()