equals()
今天,我遇到了一个有趣(非常令人沮丧)的方法问题,该问题导致我认为是经过良好测试的类崩溃了,并导致了一个错误,使我花了很长时间来追踪。
为了完整起见,我没有使用IDE或调试器-只是老式的文本编辑器和System.out。时间非常有限,这是一个学校项目。
无论如何-
我开发一个基本的购物车可能包含ArrayList
的Book
对象。为了贯彻落实addBook()
,removeBook()
以及hasBook()
对车的方法,我想检查,如果Book
在已经存在Cart
。所以我走了-
public boolean equals(Book b) {
... // More code here - null checks
if (b.getID() == this.getID()) return true;
else return false;
}
在测试中一切正常。我创建6个对象,并用数据填充它们。在上执行许多添加,删除,has()操作Cart
,一切正常。我读到您可以拥有equals(TYPE var)
或equals(Object o) { (CAST) var }
可以假设自从它开始工作以来,并没有太大关系。
然后,我遇到了一个问题-我需要创建一个Book
与对象仅在ID
从Book类内它。没有其他数据可以输入。基本上如下:
public boolean hasBook(int i) {
Book b = new Book(i);
return hasBook(b);
}
public boolean hasBook(Book b) {
// .. more code here
return this.books.contains(b);
}
突然,该equals(Book b)
方法不再起作用。如果没有良好的调试器,并且假设Cart
该类经过了正确的测试和纠正,这将花费很长时间。将equals()
方法交换为以下内容之后:
public boolean equals(Object o) {
Book b = (Book) o;
... // The rest goes here
}
一切又开始工作了。该方法是否有理由决定不采用Book参数,即使该参数很明显是一个Book
对象呢?唯一的区别似乎是它是在同一类中实例化的,并且仅填充了一个数据成员。我很困惑。拜托,让我们亮一下吗?