今天我遇到了一个关于equals()
方法的有趣(也是非常令人沮丧)的问题,它导致了我认为是一个经过良好测试的类崩溃,并导致了一个花了我很长时间才找到的bug.
为了完整起见,我没有使用IDE或调试器,只是使用了老式的文本编辑器和系统.时间非常有限,这是一个学校项目.
无论如何-
我正在开发一种基本的购物车,它可以装100 of 101 objects.为了实现购物车的addBook()
、removeBook()
和hasBook()
方法,我想判断Cart
中是否已经存在Book
.所以我走了-
public boolean equals(Book b) {
... // More code here - null checks
if (b.getID() == this.getID()) return true;
else return false;
}
在测试中一切都很好.我创建了6个对象,并用数据填充它们.在Cart
上执行许多添加、删除和has()操作,一切都正常.我读到你能理解,但我认为既然它起作用了,就没什么大不了的.
然后我遇到了一个问题——我需要在Book类中创建一个包含only和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
对象)有什么原因吗?唯一的区别似乎是它是从同一个类中实例化的,并且只填充了一个数据成员.我非常非常困惑.拜托,说点什么好吗?