最佳答案
今天,我在使用 equals()
方法时遇到了一个有趣的(也是非常令人沮丧的)问题,这个问题导致了我认为是一个经过良好测试的类崩溃,并导致了一个 bug,我花了很长时间才找到它。
为了完整起见,我没有使用 IDE 或调试器——只是使用了老式的文本编辑器和 System.out。时间是非常有限的,这是一个学校的项目。
无论如何-
我正在开发一个基本的购物车,可以包含一个 ABC1对象的 ArrayList
。为了实现购物车的 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个对象并用数据填充它们。在 Cart
上执行许多添加、删除、()操作,所有操作都能正常工作。我读到你可以 要么有 ABC1或 equals(Object o) { (CAST) var }
,但假设,因为它是工作,它没有太大的影响。
然后我遇到了一个问题-我需要在 Book 类中创建一个 Book
对象,其中包含 只有和 ID
。不会输入其他数据。基本上如下:
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
对象?唯一的区别似乎是它是从同一个类中实例化的,并且只用一个数据成员填充。我非常非常困惑。拜托,说点什么吧?