Sobrescrevendo o método equals

9 respostas
java
F

Olá a todos !

Tenho uma dúvida referente a como sobrescrever o método equals da melhor forma possível e gostaria de compartilhar com vocês.

O método equals se encontra na classe Object, sendo assim, todas as outras classes do Java irão herdar este método, possibilitando assim sobrescreve-lo. Na classe String, por exemplo, o método equals está sobrescrito para considerar que outro objeto do tipo String com o mesmo conteúdo possa ser considerado como igual. E tudo isso ocorre pois se caso utilizássemos o “==”, estaríamos fazendo comparação entre referências de memória dos objetos e não referência ao conteúdo do objeto.
Sabendo disso, caso eu desejasse utilizar o equals em meus objetos de negócio eu tenho que sobrescrever o método equals para fazer a comparação entre conteúdos e dizer se os valores dos atributos dos objetos são iguais.

Ai está o problema, para cada atributo que eu colocar em minha classe de negócio eu teria que adicionar na comparação no equals ? Todo exemplo que vi até agora, o método equals é sobrescrito comparando o valor chave entre os objetos, por exemplo, o campo código, ou ID.
Mas isso não me garante que os objetos são iguais, e sim que tem o mesmo ID ou código.

Resumindo, como eu faço isso de uma forma mais elegante ? Quero sobrescrever o método equals e comparar todos os atributos para saber se os objetos tem os mesmos valores.

Desde já, muito obrigado !

9 Respostas

I

Não entendi muito bem isso "Ai está o problema, para cada atributo que eu colocar em minha classe de
negócio eu teria que adicionar na comparação no equals ?"
Você vai sobrescrever o método uma vez só classe, geralmente o equals não fica sobrescrito na classe de negócio e sim no seu model/bean/pojo.

M

Se você realmente sobrescrever ele, toda vez q o modelo do objeto for alterado vc vai ter q atualiza-lo ( ja vi mtas vezes isso não acontecer e o programador q vai da manutenção no código perde horas até descobrir q o problema é no equals)

F

Pois é Murilo Galvão ! É disso mesmo que estou tentando correr, além de não ser uma forma “elegante” de programar, pode ocorrer problemas em diversos pontos do sistema.

F

Ola.

Estou querendo dizer que sempre que eu alterar a minha classe adicionando um novo atributo, eu terei que me lembrar de colocar este atributo na comparação do equals, e não vejo isso como uma boa prática, pois se você tem 100 atributos na classe e você deseja que o método equals da sua classe funcione comparando todos os valores de todos os atributos, os 100 atributos terão que estar no método equals.
A minha dúvida é como fazer isso de uma forma mais elegante, se existe uma boa prática para isso, entendeu ?

L

Quando você diz: “Mas isso não me garante que os objetos são iguais, e sim que tem o mesmo ID ou código.”, é exatamente isso. A sobrecarga do equals, nesse caso, será usado para verificar se os objetos são o mesmo, ou seja, possuem o mesmo identificador (seguindo esse exemplo de ID ou código).

Quando faço uso do método equals, na maioria das vezes, é para saber se tais objetos se tratam da mesma coisa. Por exemplo, quando carrego um registro do tipo pessoa de CPF [CPF removido], e possuo essa mesma pessoa carregada numa lista com várias outras pessoas, e quero verificar se a mesma existe na tal lista. A sobrecarga do método equals irá me ajudar nesse cenário.

F

Lucas, não é sobrecarga é sobrescrita, ter objetos iguais para mim não significa ter o mesmo ID ou código, quero dizer literalmente que são iguais, idênticos, que todos os atributos do objeto A tem o mesmo valor que o objeto B, e para isso tenho essa dúvida, existe uma boa prática ? Qual a melhor saída ? Terei que sempre estar colocando os atributos no equals ?

E

Dá pra bola algo com reflexão, provavelmente ficaria mais oneroso em questão de processamento, porém não teria que se preocupar quando adicionasse ou removesse atributos. Tudo uma questão de por na balança o que pesa mais …

F

Estava pensando em uma solução por esse lado mesmo…
Pensei que poderia já existir uma solução mais elegante para solucionar algo do tipo, mas muito obrigado !

M

pois é cara, é até um ponto legal de se questionar, eu nunca tinha pensado nisso…se existe uma forma mais eficiente de fazer isso e talz kkkk se achar algo posta ai pra gente…boa sorte :smiley:

Criado 18 de março de 2016
Ultima resposta 18 de mar. de 2016
Respostas 9
Participantes 5