Сегодня я столкнулся с интересной (и очень разочаровывающей) проблемой с методом equals()
, который вызвал то, что я считал хорошо испытанным классом, чтобы сбой и вызвал ошибку, которая у меня была очень длинная время для отслеживания.Переопределение метода java equals() quirk
Только для полноты я не использовал 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 объектов и заполняю их данными. У многих добавляет, удаляет, имеет() операции на 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
был правильно протестирован и исправлен. После swaapping метод equals()
к следующему:
public boolean equals(Object o) {
Book b = (Book) o;
... // The rest goes here
}
Все начали работать снова. Есть ли причина, по которой метод решил не брать параметр книги, хотя он явно был a Book
объект? Единственная разница, казалось, была создана из одного класса и заполнена только одним элементом данных. Я очень смущен. Прошу пролить свет?
Я aw что я нарушил «Контракт» относительно переопределения методов равенства, будучи рефлексивным, однако мне нужен был быстрый способ проверить, существовал ли объект в ArrayList без использования дженериков. – 2008-10-09 04:29:18
Это хороший урок, чтобы узнать о Java и равных – jjnguy 2008-10-09 04:34:59
Я не могу видеть, как корзина может быть равна книге. Я имею в виду, как может `hasBook (Book b)` вернуть результат `this.equals (b)`? – Robert 2012-07-14 00:52:12