Corri para um problema interessante (e muito frustrante) com o equals()
método hoje, que causou o travamento do que eu pensava ser uma classe bem testada e causou um bug que levou muito tempo para ser rastreado.
Apenas para completar, eu não estava usando um IDE ou depurador - apenas um bom editor de texto à moda antiga e System.out. O tempo era muito limitado e era um projeto escolar.
De qualquer forma -
Eu estava desenvolvendo um carrinho de compras básico que poderia conter um ArrayList
dos Book
objetos . A fim de implementar as addBook()
, removeBook()
e hasBook()
métodos do carrinho, eu queria verificar se o Book
já existia no Cart
. Então eu vou -
public boolean equals(Book b) {
... // More code here - null checks
if (b.getID() == this.getID()) return true;
else return false;
}
Tudo funciona bem nos testes. Crio 6 objetos e os preencho com dados. Faça muitas adições, remoções, operações com () Cart
e tudo funciona bem. Eu li que você pode ter equals(TYPE var)
ouequals(Object o) { (CAST) var }
presumiu que, como estava funcionando, não importava muito.
Então eu corri para um problema - eu precisava para criar um Book
objeto com única a ID
nele de dentro da classe Book. Nenhum outro dado seria inserido nele. Basicamente o seguinte:
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, o equals(Book b)
método não funciona mais. Demorou MUITO tempo para rastrear sem um bom depurador e assumindo que a Cart
classe foi testada e correta corretamente. Depois de trocar o equals()
método para o seguinte:
public boolean equals(Object o) {
Book b = (Book) o;
... // The rest goes here
}
Tudo começou a funcionar novamente. Existe uma razão pela qual o método decidiu não usar o parâmetro Book, mesmo que claramente fosse um Book
objeto? A única diferença parecia ser instanciada na mesma classe e preenchida apenas com um membro dos dados. Estou muito, muito confusa. Por favor, lançar alguma luz?