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