使用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?