equals()Dzisiaj napotkałem interesujący (i bardzo frustrujący) problem z tą metodą, który spowodował awarię klasy, którą uważałem za dobrze przetestowaną, i spowodowanie błędu, którego wytropienie zajęło mi bardzo dużo czasu.
Dla kompletności nie używałem IDE ani debuggera - tylko dobry, staroświecki edytor tekstu i System.out. Czas był bardzo ograniczony i był to projekt szkolny.
W każdym razie -
Ja rozwijał podstawowy koszyk, które mogą zawierać ArrayListod Bookobiektów . W celu wprowadzenia w życie addBook(), removeBook()oraz hasBook()metod Koszyka, chciałem sprawdzić, czy Bookistniała już w Cart. Więc idę -
public boolean equals(Book b) {
... // More code here - null checks
if (b.getID() == this.getID()) return true;
else return false;
}
W testowaniu wszystko działa dobrze. Tworzę 6 obiektów i wypełniam je danymi. Czy wiele dodaje, usuwa, ma operacje () na Carti wszystko działa dobrze. Czytałem, że możesz albo mieć, equals(TYPE var)alboequals(Object o) { (CAST) var } założyć, że skoro to działa, nie ma to większego znaczenia.
Potem napotkałem problem - musiałem stworzyć Bookobiekt zawierający tylko ten obiekt z IDklasy Book. Żadne inne dane nie zostałyby do niego wprowadzone. Zasadniczo następujące:
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);
}
Nagle equals(Book b)metoda przestaje działać. To zajęło BARDZO dużo czasu, aby wyśledzić bez dobrego debuggera i przy założeniu, że Cartklasa została odpowiednio przetestowana i poprawna. Po przejściu equals()metody do następującego:
public boolean equals(Object o) {
Book b = (Book) o;
... // The rest goes here
}
Wszystko znów zaczęło działać. Czy istnieje powód, dla którego metoda zdecydowała się nie przyjmować parametru Book, mimo że najwyraźniej był to Bookobiekt? Jedyna różnica polegała na tym, że został utworzony z tej samej klasy i wypełniony tylko jednym składnikiem danych. Jestem bardzo zdezorientowany. Proszę, rzuć trochę światła?