Сегодня я столкнулся с интересной (и очень расстраивающей) проблемой, связанной с методом equals()
которая привела к сбою в том, что я считаю хорошо протестированным классом, и к ошибке, на которую у меня ушло очень много времени.
Просто для полноты, я не использовал IDE или отладчик - просто старый добрый текстовый редактор и System.out. Время было очень ограничено, и это был школьный проект.
Во всяком случае -
Я разрабатывал базовую корзину для покупок, которая могла бы содержать объекты ArrayList
of 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
? Казалось, единственное отличие было в том, что он был создан из одного и того же класса и заполнен только одним элементом данных. Я очень, очень смущен. Пожалуйста, пролить немного света?