当没有定义equals()和hashCode()时,我应该如何实现Comparable?

时间:2013-03-29 16:16:16

标签: java comparable

我的团队正在处理的代码有几个类,其中equalshashCode未在类层次结构中定义。我们希望实施Comparable,以便compareTo与使用equals的{​​{1}}保持一致,如下所示:

hashCode

这被视为实施class MyClass implements Comparable<MyClass> { private String myProperty; // Other properties, etc. .... public int compareTo(MyClass obj) { // Natural ordering comparisons ... // Reach here if natural ordering properties are equivalent return new Integer(this.hashCode()).compareTo(new Integer(obj.hashCode()); } } 的有效方式吗?使用我应该注意的默认Comparable实现是否存在任何缺陷?

更新:我们正在努力的行为如下:

  1. 首先按照我们定义的自然顺序比较类属性。
  2. 如果两个对象的给定属性是等价的,我们将继续进行订购​​中的下一个属性。
  3. 如果所有属性都相同,则仅在hashCode
  4. 时返回0

2 个答案:

答案 0 :(得分:0)

不,这不是实施Comparable的有效方法。因为,假设MyClass方法中equals的两个不同对象的所有自然排序比较都成立,那么当比较两个对象的哈希码时,它将返回false。这是因为在这种情况下,默认情况下将调用hashcode类的Object方法(因为您没有提供自己的哈希码方法),这对于不同的对象将是不同的。因此,无论所有自然排序比较是true,MyClass的两个对象永远不会相等。

答案 1 :(得分:0)

是的,这是一种有效的方法。显然你想要对其他值相等的对象进行固定排序(我是对的吗?你没有用这里的哈希码用法解释你的目标)。 我唯一要做的就是在compareTo方法中复制Integer.compareTo()的java代码,这样就不必为每次比较创建2个整数。