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 ArrayListdi Bookoggetti . Al fine di implementare il addBook(), removeBook()e hasBook()metodi del carrello, ho voluto verificare se il Bookgià 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 Carte 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 Bookoggetto con solo l' IDinterno 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 Cartclasse 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 Bookoggetto? 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?