一般问题:在 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 对于类 C 的每个 e1 和 e2 具有与 e1.equals(e2) 相同的布尔值时,类 C 的自然排序被称为与 equals 一致。注意null 不是任何类的实例,即使 e.equals(null) 返回 false,e.compareTo(null) 也应该抛出 NullPointerException
编辑:
经过进一步审查,我发现Comparable文档还指出以下内容:
实现者必须确保所有 x 和 y 的 sgn(x.compareTo(y)) == -sgn(y.compareTo(x))。(这意味着如果 y.compareTo(x) 抛出异常,则 x.compareTo(y) 必须抛出异常。)
因此,由于null.compareTo(x)
显然会抛出NPE,x.compareTo(null)
因此也应该抛出 NPE 。而对于equals,情况不一定如此。我对正确处理 NPE 非常重视,所以我觉得这相对重要。