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ć ArrayList
od Book
obiektów . W celu wprowadzenia w życie addBook()
, removeBook()
oraz hasBook()
metod Koszyka, chciałem sprawdzić, czy Book
istniał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 Cart
i 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ć Book
obiekt zawierający tylko ten obiekt z ID
klasy 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 Cart
klasa 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 Book
obiekt? 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?