[英]Testing for equality in Java
您如何在Java中使用equals方法? 在JUnit中,我正在通过断言它们是否相等来测试初始化为相等的两个值是否相同,但是我的测试失败了。 我确保检查传入的对象是否是另一个对象的实例,但是我不确定为什么测试失败。
@Test
public void testEqualityOnBillSimple()
{
Date d1 = new Date( 3,4,2020);
Money m1 = new Money(10);
Bill b1 = new Bill( m1, d1, "fred");
Bill b2 = new Bill( m1, d1, "fred");
assertTrue( b1.equals(b2));
}
public boolean equals (Object toCompare) {
try {
if (toCompare instanceof Bill) {
Bill that = (Bill) toCompare;
return this.amount.equals(that.amount) &&
this.dueDate.equals(that.dueDate) &&
this.paidDate.equals(that.paidDate) &&
this.originator.equals(that.originator);
}
} catch (Exception e) {
}
return false;
}
您如何在Java中使用equals方法?
你叫!
您真正想知道的是为什么测试失败。 这归结于如何正确实现equals(Object)
。 通常,答案是它取决于(整个)对象的预期语义。
从表面上看,您编写的代码基本上是正确的。 捕获和压缩Exception
是一种不好的做法,在语义上可能不正确。 它可能隐藏了问题的真正原因; 例如,在现场比较之一中出现了意外的NPE。
您评论了:
我意识到这很成问题,但是现在对我的代码有影响吗?
可能是的!
正确的行为是“ equals
,可能允许任何意外的未经检查的异常传播。 比较具有缺失字段的不完整Bill
对象可以说是不正确的。 如果代码旨在解决该问题(即null
字段),则应使用null
测试来避免使用NPE。
(我认为将null
字段视为导致equals
返回false
是没有意义的。例如,如果将具有null
字段的Bill
与自身进行比较,该怎么办。)
为了完全确定没有其他问题,我们需要查看Bill
类的其余实施情况。
最后,正如@ a-sir所指出的,如果您覆盖equals
,则(在技术上)也应覆盖hashCode
。 如果您在Bill
HashMap
或HashSet
的元素中使用Bill
作为键,并且类具有不兼容的equals
和hashCode
方法,则将发生不好的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.