Ich bin heute auf ein interessantes (und sehr frustrierendes) Problem mit der equals()
Methode gestoßen, das dazu führte, dass eine meiner Meinung nach gut getestete Klasse abstürzte und einen Fehler verursachte, dessen Aufspüren sehr lange gedauert hat.
Der Vollständigkeit halber habe ich keine IDE oder keinen Debugger verwendet - nur einen guten, altmodischen Texteditor und System.out's. Die Zeit war sehr begrenzt und es war ein Schulprojekt.
Wie auch immer -
Ich entwickelte einen einfachen Einkaufswagen, ArrayList
der Book
Objekte enthalten konnte . Um das ,, und die Methoden des Cart zu implementieren addBook()
, wollte ich überprüfen, ob das bereits im vorhanden ist . Also los geht's -removeBook()
hasBook()
Book
Cart
public boolean equals(Book b) {
... // More code here - null checks
if (b.getID() == this.getID()) return true;
else return false;
}
Beim Testen funktioniert alles einwandfrei. Ich erstelle 6 Objekte und fülle sie mit Daten. Führen Sie viele Operationen zum Hinzufügen, Entfernen und Ausführen von () durch, Cart
und alles funktioniert einwandfrei. Ich habe gelesen, dass man entweder haben kann equals(TYPE var)
oderequals(Object o) { (CAST) var }
aber angenommen hat, dass es nicht allzu wichtig ist, da es funktioniert.
Dann stieß ich auf ein Problem - ich musste ein Book
Objekt mit nur dem ID
darin aus der Book-Klasse erstellen . Es würden keine anderen Daten eingegeben. Grundsätzlich gilt Folgendes:
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);
}
Plötzlich equals(Book b)
funktioniert die Methode nicht mehr. Das Aufspüren ohne einen guten Debugger dauerte SEHR lange und vorausgesetzt, die Cart
Klasse wurde ordnungsgemäß getestet und korrekt. Nach dem Austausch der equals()
Methode auf Folgendes:
public boolean equals(Object o) {
Book b = (Book) o;
... // The rest goes here
}
Alles begann wieder zu funktionieren. Gibt es einen Grund, warum die Methode beschlossen hat, den Book-Parameter nicht zu verwenden, obwohl es sich eindeutig um ein Book
Objekt handelt? Der einzige Unterschied schien darin zu bestehen, dass es aus derselben Klasse heraus instanziiert und nur mit einem Datenelement gefüllt wurde. Ich bin sehr sehr verwirrt. Bitte, etwas Licht ins Dunkel bringen?