糟糕的做法 - 类定义compareTo(...)并使用Object.equals()

时间:2013-05-22 20:29:34

标签: java sonarqube

想知道列出的方法需要做什么

 public final int compareTo(final FieldDTO o) {
        return o.available.compareTo(this.available);

它在第2行引发异常  糟糕的做法 - 类定义compareTo(...)并使用Object.equals()16天
field定义compareTo(FieldDTO)并使用Object.equals()

不知道我该怎么办呢。 提前谢谢。

4 个答案:

答案 0 :(得分:9)

如果您定义compareTo,则至少应定义equals

boolean equals(it) { 
  return compareTo(it) == 0; 
} 

否则当您将对象放入MapSet时,您会遇到奇怪的问题。通常也应该定义hashCode

答案 1 :(得分:5)

这是FindBugs的文档:

  

Eq:Class定义compareTo(...)并使用Object.equals()   (EQ_COMPARETO_USE_OBJECT_EQUALS)

     

此类定义compareTo(...)方法但继承其equals()   java.lang.Object中的方法。通常,compareTo的值应该是   当且仅当equals返回true时返回零。如果违反此规定,   奇怪和不可预测的失败将发生在类如   的PriorityQueue。在Java 5中,PriorityQueue.remove方法使用   compareTo方法,而在Java 6中它使用equals方法。

     

来自Comparable接口中compareTo方法的JavaDoc:

     

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

因此,您似乎需要实现equals方法,从而覆盖Object的默认实现。

答案 2 :(得分:4)

您需要重写Object类equals()和hashCode()方法。 使用IDE生成的代码,它将拉出所有Object属性并为您创建方法。

在eclipse IDE上:

  1. 右键点击课程
  2. 选择来源
  3. 生成hashCode()和equals()...

答案 3 :(得分:0)

您的课程似乎实现了Comparable界面。

JavaDocs在这里是严格的:如果您使用自己的compareTo()方法,则只有equals()方法返回 true 时才返回0。

所以:

(x.compareTo==0) == (x.equals).