编辑:问题的核心
身份测试何时通过,传统的 equals 方法的其余部分何时失败?这只是为了节省做额外工作的时间吗?
原帖
我正在测试的类中使用来自org.apache.commons.lang3.builder.CompareToBuilder的CompareToBuilder 。我注意到EqualsBuilder需要在调用 equals 构建器之前显式调用以下代码。
if (obj == this) { return true; } // Identity test
这样的逻辑也出现在 Eclipse 自动生成的 equals 方法中。我试图通过让我的方法简单地调用我的方法并将等效性测试为 0来使用DRY方法。equals
compareTo
一个问题是我是否需要在我的 equals 方法中包含上面的代码,将它添加到我的 compareTo 方法中,或者它是否已经被CompareToBuilder覆盖。我注意到CompareToBuilder检查传递的参数的等效性,但没有收到对原始 lhs(this)和 rhs(Object obj)的任何直接引用。这使我认为这是我应该在 compareTo 方法中纠正的疏忽。
我最大的问题是我似乎无法设计一个潜在的测试用例,obj == this
但this.compareTo(obj) != 0
. 唯一想到的是在一个不正确实现的 compareTo 中,如果没有首先检查相应的变量 inthis
是否也为 null,则发送带有其实例变量之一 null 的 obj 可能会返回一个非零数。(昨天碰到这个)。
样本等于方法:
@Override
public boolean equals(Object obj) {
if (obj != null && obj instanceof MyClass)
return this.compareTo((MyClass)obj) == 0;
return false;
}
示例 compareTo 方法
@Override
public int compareTo(MyClass other) {
return new CompareToBuilder()
.append(this.getParam1(), other.getParam1())
.append(this.getParam2(), other.getParam2())
.toComparison();
}