不良实践 - 类定义了compareTo(...)并使用Object.equals()

8

想知道如何执行所列出的方法

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

第2行抛出异常,指出不良实践 - 类定义了compareTo(...)并使用Object.equals() 16天
字段定义了compareTo(FieldDTO)并使用Object.equals()

不确定应该如何处理这个问题。 提前致谢。


3
真的抛出了异常吗?还是只是一个警告(可能是由findBugs产生的)? - zw324
FieldDTO 似乎是你项目中的一个内部类,请向创建者询问此问题。 - fmodos
3个回答

13

如果你定义了 compareTo 方法,那么你至少应该定义 equals 方法。

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

否则当您将对象放入MapSet中时,可能会出现奇怪的问题。通常最好也定义 hashCode


8

您需要覆盖Object类的equals()和hashCode()方法。

使用IDE生成的代码,它将提取所有Object属性并为您创建方法。

在Eclipse IDE中:

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

7
这是FindBugs的文档:
Eq: 类定义了compareTo(...)并使用Object.equals()方法(EQ_COMPARETO_USE_OBJECT_EQUALS)
这个类定义了一个compareTo(...)方法,但是它继承了java.lang.Object的equals()方法。通常情况下,compareTo返回0时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实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接