Mi sono imbattuto in un problema interessante (e molto frustrante) con il equals()
metodo oggi che ha causato l'arresto anomalo di quella che pensavo fosse una classe ben collaudata e causava un errore che mi ha impiegato molto tempo a rintracciarlo.
Solo per completezza, non stavo usando un IDE o un debugger, solo un buon editor di testo vecchio stile e System.out. Il tempo era molto limitato ed era un progetto scolastico.
Comunque -
Stavo sviluppando un carrello di base che potrebbe contenere un ArrayList
di Book
oggetti . Al fine di implementare il addBook()
, removeBook()
e hasBook()
metodi del carrello, ho voluto verificare se il Book
già esisteva nel Cart
. Quindi vado via -
public boolean equals(Book b) {
... // More code here - null checks
if (b.getID() == this.getID()) return true;
else return false;
}
Tutto funziona bene nei test. Creo 6 oggetti e li riempio di dati. Fai molte aggiunte, rimuove, ha () operazioni su Cart
e tutto funziona bene. Ho letto che puoi avere equals(TYPE var)
oequals(Object o) { (CAST) var }
ma supporre che dal momento che funzionava, non importava troppo.
Poi ho riscontrato un problema: avevo bisogno di creare un Book
oggetto con solo l' ID
interno all'interno della classe Book. Nessun altro dato verrebbe inserito al suo interno. Fondamentalmente il seguente:
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);
}
Improvvisamente, il equals(Book b)
metodo non funziona più. Questo ha impiegato MOLTO molto tempo per rintracciare senza un buon debugger e supponendo che la Cart
classe fosse correttamente testata e corretta. Dopo aver sostituito il equals()
metodo nel modo seguente:
public boolean equals(Object o) {
Book b = (Book) o;
... // The rest goes here
}
Tutto ha ripreso a funzionare. C'è una ragione per cui il metodo ha deciso di non prendere il parametro Book anche se chiaramente era un Book
oggetto? L'unica differenza sembrava essere stata istanziata all'interno della stessa classe e riempita con un solo membro di dati. Sono molto molto confuso. Per favore, fai luce?