如何在Java中使用equals方法?在JUnit中,我正在测试看两个初始化为相等的值是否相同,断言它们是,但我的测试失败了。我确保检查传入的Object是另一个对象的实例,但我不确定为什么我的测试失败了。
@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;
}
答案 0 :(得分:3)
如何在Java中使用equals方法?
你叫它!
你真正想知道的是为什么你的测试失败了。这可以归结为正确实现equals(Object)
的方式。通常,答案是它取决于(整个)对象的预期语义。
面对面,您编写的代码大多是正确的。像你所做的那样捕捉和挤压Exception
是不好的做法,而且可能在语义上不正确。 可以隐藏您问题的真正原因;例如在一次现场比较中出现意料之外的NPE。
您评论道:
我意识到这是有问题的,但它现在对我的代码有影响吗?
可能,是的!
equals
的正确行为可能会允许任何未预料到的未经检查的异常传播。比较缺少字段的不完整Bill
对象可能是不正确的。如果代码旨在处理(即null
字段),那么您应该使用null
测试来避免NPE。
(我认为将null
字段视为导致equals
返回false
是不合理的。如果您将Bill
与{{{}}进行比较怎么办?例如,1}}字段对抗自身。)
为了完全确定没有其他问题,我们需要查看null
类的其余实现。
最后,正如@ a-sir指出的那样,如果你覆盖Bill
,你应该(技术上)覆盖equals
。如果您使用hashCode
作为Bill
中的关键字或HashMap
的元素,则会发生错误的事情...并且该类与HashSet
和{{不兼容1}}方法。