Ant*_*nyW 12 java equals compareto
一般问题:equals在Java中实现默认方法的覆盖时,我应该关注简单地利用已经实现的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;
}
Run Code Online (Sandbox Code Playgroud)
编辑: 引用可比较文档
当且仅当e1.compareTo(e2)== 0与c1的每个e1和e2的e1.equals(e2)具有相同的布尔值时,C类的自然排序被认为与equals一致. null不是任何类的实例,并且e.compareTo(null)应该抛出NullPointerException,即使e.equals(null)返回false
编辑:
经过进一步审查后,我发现可比较文件还说明了以下内容:
实现者必须确保所有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的正确处理非常重视,所以我发现这个相对重要.
小智 6
之间的差equals()和compareTo()是,equals()只是检查是否其中两个对象彼此相等compareTo()用于识别指定的类的实例的自然顺序.此外equals()方法有合同hashCode()的方法,但compareTo()并非如此.
根据JavaDoc:
请注意,null不是任何类的实例,并且即使e.equals(null)返回false,e.compareTo(null)也应抛出NullPointerException.
强烈建议,但并非严格要求(x.compareTo(y)== 0)==(x.equals(y)).一般来说,任何实现Comparable接口并且违反此条件的类都应该清楚地表明这一事实.推荐的语言是"注意:此类具有与equals不一致的自然顺序."
您可以随意重用compareTo()在你的方法逻辑equals()的方法,但记住所有合同的equals(),hashCode()并合约从Java文档compareTo()的方法.如果他们不相互冲突,那就继续吧.
我认为合同的执行更为重要.
| 归档时间: |
|
| 查看次数: |
4402 次 |
| 最近记录: |