我的团队正在处理的代码有几个类,其中equals
和hashCode
未在类层次结构中定义。我们想实现Comparable
这样compareTo
与equals
一致使用hashCode
,就像这样:当equals()和hashCode()未定义时,应如何实现Comparable?
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
的有效手段?使用我应该知道的默认实现hashCode
是否有任何缺陷?
UPDATE:我们追求的行为如下:
- 类的属性首先相比,自然排序,我们定义。
- 如果两个对象的给定属性是等价的,我们继续下一步。
- 如果所有属性都是相同的,只有在
this.equals(obj)
的情况下我们才返回0。
对于具有相同值的对象,内部'hashCode()'可能不会给你相同的结果,所以最好定义你自己的值。 –
这是所有关于你想比较你的对象的标准。 – sp00m
我通常更喜欢Comparable的内联匿名定义,但我认为如果您需要始终在任何地方使用相同的排序,那么将该实现放入您的域对象是完全可以接受的。然而,就像@HunterMcMillen所说的那样,hashCode并不是真正用来比较的东西。哈希可以重新使用。你最好比较自己想要的部分。 – CodeChimp