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