java如果没有定义equals()和hashCode(),我应该如何实现Comparable?
我的团队正在处理的代码有几个类,其中equals
和hashCode
未在类层次结构中定义。我们希望实现Comparable
,这样compareTo
与使用hashCode
的equals
一致,如下所示:
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
实现是否有我应该注意的缺陷
更新:我们努力追求的行为如下:
- 首先按照我们定义的自然顺序比较类属性李>
- 如果两个对象的一个给定属性是等价的,那么我们将转到排序中的下一个李>
- 如果所有属性都相等,则仅当
this.equals(obj)
时才返回0李>
# 1 楼答案
是的,这是一个有效的方法。显然,您希望对象在其他值上具有相同的固定顺序(我说的对吗?您没有在这里解释hashcode用法的目的)。 我唯一要做的就是复制Integer的java代码。compareTo()在compareTo方法中,因此不必为每次比较创建2个整数
# 2 楼答案
不,这不是有效的实施方法。因为,假设您对
equals
方法中MyClass
的两个不同对象的全自然排序比较实现,然后当比较两个对象的hashcode时,它将返回false
。这是因为在本例中,Object
类的hashcode
方法将在默认情况下被调用(因为您没有提供自己的hashcode方法),这对于不同的对象是不同的。因此,无论所有自然排序比较结果是true
,MyClass的两个对象永远不会相等