Me encontré con un problema interesante (y muy frustrante) con el método equals()
hoy que causó que se bloqueara lo que pensé que era una clase bien probada y causó un error que me llevó mucho tiempo hora de localizar.Sobrescribir la peculiaridad del método java equals()
Para completar, no estaba usando un IDE o un depurador, solo un buen editor de texto antiguo y System.out's. El tiempo fue muy limitado y fue un proyecto escolar.
De todos modos -
que estaba desarrollando un carrito de la compra básica que podría contener un ArrayList
de Book
objetos. Para implementar los métodos addBook()
, removeBook()
y hasBook()
del carro, quería verificar si el Book
ya existía en el Cart
. Así que voy -
public boolean equals(Book b) {
... // More code here - null checks
if (b.getID() == this.getID()) return true;
else return false;
}
Todo funciona bien en las pruebas. Creo 6 objetos y los llevo con datos. Realiza muchas operaciones de adición, eliminación, has() en el Cart
y todo funciona bien. Leí que puede tener equals(TYPE var)
o equals(Object o) { (CAST) var }
, pero asumió que, dado que funcionaba, no importaba demasiado.
Entonces me encontré con un problema - que necesitaba para crear un objeto con Book
única la ID
en ella desde dentro de la clase de libro. No se ingresarían otros datos. Básicamente lo siguiente:
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);
}
De repente, el método equals(Book b)
ya no funciona. Esto llevó MUCHO tiempo en rastrear sin un buen depurador y suponiendo que la clase Cart
se había probado correctamente y era correcta. Después Swaapping el método equals()
a lo siguiente:
public boolean equals(Object o) {
Book b = (Book) o;
... // The rest goes here
}
Todo comenzó a trabajar de nuevo. ¿Hay alguna razón por la que el método decidió no tomar el parámetro Book aunque claramente era un objeto Book
? La única diferencia parecía ser que se creaba una instancia dentro de la misma clase, y solo se llenaba con un miembro de datos. Estoy muy confundido. Por favor, arroja algo de luz?
Soy aw es que violé el 'Contrato' sobre la anulación de los métodos iguales al ser reflexivo; sin embargo, necesitaba una forma rápida de verificar si el objeto existía en el ArrayList sin usar genéricos. –
Esta es una buena lección para aprender sobre Java y es igual a – jjnguy
No puedo ver cómo un carrito de compras puede ser igual a un libro. Quiero decir, ¿cómo puede 'hasBook (Book b)' devolver el resultado de 'this.equals (b)'? – Robert