Я зіткнувся з цікавим (і дуже засмучуючим) питанням із 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 об’єктів і заповнюю їх даними. Зробіть багато додавань, видалень, виконує () операції над 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
об'єктом? Єдиною різницею здавалося, що вона була створена у межах одного класу та заповнена лише одним членом даних. Я дуже розгублений. Будь ласка, пролити трохи світла?