【发布时间】:2013-05-30 18:51:26
【问题描述】:
编辑:问题的核心
身份测试何时会通过,而传统的 equals 方法的其余部分何时会失败?这是为了节省做额外工作的时间而添加的吗?
原帖
我在我正在测试的课程中使用来自org.apache.commons.lang3.builder.CompareToBuilder 的CompareToBuilder。我注意到 EqualsBuilder 需要在调用 equals 构建器之前显式调用以下代码。
if (obj == this) { return true; } // Identity test
这样的逻辑也出现在 Eclipse 自动生成的 equals 方法中。我试图通过让我的equals 方法简单地调用我的compareTo 方法并测试与0 的等效性来使用DRY 方法。
一个问题是我是否需要在我的 equals 方法中包含上面的代码,将它添加到我的 compareTo 方法中,或者它是否已经被 CompareToBuilder 覆盖。我注意到CompareToBuilder 检查传递的参数的等价性,但没有收到对原始 lhs(this)和 rhs(Object obj)的任何直接引用。这让我认为这是我应该在 compareTo 方法中纠正的疏忽。
我最大的问题是我似乎无法设计一个潜在的测试用例,其中obj == this 而是this.compareTo(obj) != 0。 唯一想到的是一个不正确实现的 compareTo,发送 obj如果不首先检查 this 中的相应变量是否也为空,则其实例变量之一 null 可能会返回一个非零数。 (昨天碰到这个)。
示例等于方法:
@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();
}
【问题讨论】:
-
困惑。如果
obj==this你希望compareTo为0。它是同一个对象。 -
理想情况下,这是最终目标。可以肯定的是,我想尝试通过传递一些无法给出正确响应的东西来破坏代码,除非
if (obj == this) { return true; }在那里。 -
值得注意的是,我故意省略了对
appendSuper的调用,因为MyClass的超类不会覆盖equals或compareTo,我无能为力它。 (不同的开发团队)。
标签: java equals apache-commons compareto