我遇到了一个有趣的(而且非常令人沮丧的)问题equals()
今天的方法导致我认为经过良好测试的类崩溃并导致一个错误,我花了很长时间才找到它。
为了完整起见,我没有使用 IDE 或调试器 - 只是使用老式文本编辑器和 System.out。时间非常有限,而且这是一个学校项目。
无论如何——
我正在开发一个基本的购物车,其中可以包含ArrayList
of Book
objects。为了实施addBook()
, removeBook()
, and 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)
or equals(Object o) { (CAST) var }
但假设既然它正在工作,那就没什么太大关系了。
然后我遇到了一个问题 - 我需要创建一个Book
对象与only the 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 参数,即使它很明显 was a Book
目的?唯一的区别似乎是它是在同一个类中实例化的,并且只填充了一个数据成员。我非常非常困惑。请透露一些信息?