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