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

Mau*_*zey 6 java sonarqube

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

 public final int compareTo(final FieldDTO o) {
        return o.available.compareTo(this.available);
Run Code Online (Sandbox Code Playgroud)

它在第2行
引发异常,说明不良做法 - 类定义compareTo(...)并使用Object.equals()16天字段定义compareTo(FieldDTO)并使用Object.equals()

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

Old*_*eon 9

如果你定义compareTo你至少应该定义equals

boolean equals(it) { 
  return compareTo(it) == 0; 
} 
Run Code Online (Sandbox Code Playgroud)

当你把对象放在Maps和Sets中时,你会遇到奇怪的问题.通常也很好的做法是定义hashCode.


zw3*_*324 5

这是FindBugs的文档:

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

此类定义compareTo(...)方法,但从java.lang.Object继承其equals()方法.通常,当且仅当equals返回true时,compareTo的值才应返回零.如果违反了此规则,则会在诸如PriorityQueue之类的类中发生奇怪且不可预测的故障.在Java 5中,PriorityQueue.remove方法使用compareTo方法,而在Java 6中,它使用equals方法.

从Comparable接口中的compareTo方法的JavaDoc:

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

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


小智 5

您需要覆盖 Object 类的 equals() 和 hashCode() 方法。使用 IDE 为这些生成的代码,它将拉取所有对象属性并为您创建方法。

在 Eclipse IDE 上:

  1. 右键单击类
  2. 选择来源
  3. 生成 hashCode() 和 equals()...