使用compareTo实现equals方法

一般问题:在Java中实现对默认equals方法的重写时,我应该关注如何简单地使用已实现的compareTo方法与将独立逻辑写入equals方法? 我注意到有人在另一个问题中提到foo.equals((String)null)返回false,而String.compareTo((String)null)抛出一个NullPointerException 。 什么使这些不一致的结果成为理想的功能

样本equals方法:

@Override
public boolean equals(Object obj) {
    if (obj != null && obj instanceof MyClass) {
        MyClass msg = (MyClass)obj;
        return this.compareTo(msg) == 0;
    }
    return false;
}

编辑:从Comparable文档引用

当且仅当e1.compareTo(e2)== 0与e1.equals(e2)具有相同的布尔值时,类C的自然顺序被认为与equals相等。对于类C的每个e1和e2,请注意null不是任何类的实例,即使e.equals(null)返回false,e.compareTo(null)也应抛出NullPointerException

编辑:

经过进一步审查后,我发现需要注意的是,可比较文件还说明了以下内容:

实现者必须为所有x和y确保sgn(x.compareTo(y))== -sgn(y.compareTo(x))。 (这意味着如果y.compareTo(x)抛出异常,则x.compareTo(y)必须抛出异常。)

因为null.compareTo(x)显然会抛出一个NPE, x.compareTo(null)应该抛出一个NPE。 而对于平等,情况并非一定如此。 我对NPE的正确处理非常重要,所以我觉得这个比较重要。


equals()compareTo()之间的区别在于, equals()只是检查两个对象是否相等,其中compareTo()用于标识指定类的实例的自然顺序。 equals()方法与hashCode() equals()方法有一个约定,但compareTo()方法没有。

根据JavaDoc:

请注意,null不是任何类的实例,即使e.equals(null)返回false,e.compareTo(null)也应抛出NullPointerException。

强烈建议,但不是严格要求(x.compareTo(y)== 0)==(x.equals(y))。 一般来说,任何实现了Comparable接口并违反这个条件的类都应该清楚地表明这个事实。 推荐的语言是“注意:这个类的自然排序与equals不一致”。

您可以随意重用compareTo()在你的方法逻辑equals()方法,但记住所有的合同到equals()hashCode() ,通过javadoc和合同compareTo()方法。 如果他们不相互冲突,那么继续。

我认为合同的执行是更重要的一点。


compareTo可能涉及更多的工作,只是为了获得平等答案,这可能最终成为性能问题,具体取决于您的应用程序使用情况。

除此之外,遵循DRY原则,按照您的建议重新使用代码将是一个不错的主意。

链接地址: http://www.djcxy.com/p/76215.html

上一篇: Implementing equals method using compareTo

下一篇: Should I throw a NullPointerException explicitly or let Java do it for me?