所以我有这段代码:
Item i = new Item(ID, TITLE, DESCRIPTION) { };
Item i2 = new Item(ID, "", "") { };
assertEquals("Item(id=1)", i.toString());
assertEquals("Item(id=1)", i2.toString());
assertNotSame(i, i2);
assertEquals(i, i2);
assertThat(0, not(equalTo(i.compareTo(i2))));
Item i3 = new Item(BigInteger.TEN, "", "") { };
assertEquals("Item(id=10)", i3.toString());
assertNotSame(i, i3);
assertThat(i, not(equalTo(i3)));
还提供:
@Override
public final int compareTo(final Item o) {
int c = o.title.compareTo(title);
if (c == 0) {
c = o.id.compareTo(id);
}
return c;
}
它通过assertNotSame(i, i2);
但在assertEquals(i, i2);
失败我试图覆盖toString()
方法,但这没有帮助。实际上写的是Item(id=1)
是预期的,它确切地Item(id=1)
,但仍然存在问题。
我看到其他线程中的建议覆盖了equals
方法,但实际上并不知道如何做到这一点。
答案 0 :(得分:3)
您需要覆盖equals(Object)
方法:
@Override
public boolean equals (Object o) {
if (!o instanceof Item) {
return false;
}
Item other = (Item)o;
return getId().equals(other.getId()) &&
getTitle().equals(other.getTitle()) &&
getDescription().equals(other.getDescription());
}
为了不违反Java关于equals(Object)
和hashCode()
的合同,您还需要覆盖它。 e.g:
@Override
public int hashCode() {
final int prime = 31;
result = prime * result + getId().hashCode();
result = prime * result + getTitle().hashCode();
result = prime * result + getDescription().hashCode();
return result;
}
注意:假设您的所有成员都不是null
,这些都是天真的实现。
答案 1 :(得分:1)
您需要实现Object.equals方法来提供有意义的相等性测试,即使用对象的属性。另外,最佳实践规定你还应该实现hashCode(),这在使用你的对象作为HashMap中的键正确行为时通常是必需的
我看到你实现了java.lang.Comparable,这通常只用于允许使用Collections.sort进行排序。
遗憾的是,Assert.assertEquals的Javadoc没有提及新Java程序员的Object.equals()。
答案 2 :(得分:0)
你应该重写equals方法。 (还有hashCode)
答案 3 :(得分:-1)
感谢您的回答。实际上我只需要生成equals()
和hashode()
方法,以便在此时仅包含id
字段。我选择了我的构造函数Source>生成hashCode()和equals()...