0

我的团队正在处理的代码有几个类,其中equalshashCode没有在类层次结构中定义。我们希望实现ComparablecompareTousing 一致的equals方法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吗?hashCode使用我应该注意的默认实现是否有任何陷阱?

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

  1. 首先比较类属性,按照我们定义的自然顺序。
  2. 如果两个对象的给定属性是等价的,我们将继续进行排序中的下一个。
  3. 如果所有属性都等价,则仅当 时才返回 0 this.equals(obj)
4

2 回答 2

0

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

于 2013-03-29T16:25:35.823 回答
0

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

于 2013-03-29T16:26:47.597 回答