DEV Community

Paula Santana
Paula Santana

Posted on • Updated on

Java Efetivo Essencial - Equals

Obedeça ao contrato geral ao sobrescrever o equals

Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo.

O que é?

Todas as classes do Java herdam os métodos da classe Object. Dentre esses métodos o método equals, utilizado para comparar objetos.
Por padrão essa implementação utiliza a identificação da instância para comparar .
O livro deixa claro que existem inúmeros problemas que podem ocorrer ao sobrescrever esse método então, enfatiza em que situações você deveria evitar de realizar essa ação.

Quando não sobrescrever

  • Quando sua classe for uma entidade ativa ao invés de valores, exemplo Classe ativa seria a classe thread ou um controller, já a classe de valor seria a que você modela a entidade do banco de dados como a classe Cliente.
  • Classes que não serão utilizadas para igualdade lógica como helpers, mappers, converters, ou classes semelhantes com esse propósito.
  • Quando a super classe já sobrescreveu o equals e este comportamento já atende as classes filhas, no livro é citado como exemplo o caso das classes de Collections, por exemplo as implementações de List que vêm da AbstractList.
  • Quando a classe é privada ou esta em pacote privado e você tem certeza de que o método equals nunca será invocado.

E quando pode?

Faz sentido sobrescrever quando uma classe terá sentido de igualdade lógica através dos seus atributos, diferente de simplesmente usar o identificador da instância.
Exemplo: Você tem uma classe cliente, se tivermos duas instâncias do mesmo cliente e compararmos sem sobrescrever o equals ele irá entender que não são iguais pois são instâncias diferentes, mas os objetos tem os dados do mesmo cliente e deveriam ser considerados iguais.

Impactos

Precisamos ter em mente que o Java utiliza o método equals para comparar objetos em diversas apis da linguagem, como por exemplo na api de Colletions e Map, sobrescrever o equals fará com que o comportamento nessas estruturas seja impactado e é importante entender para saber se vale a pena sobrescrever o método equals.
O livro cita a importância de seguirmos algumas regras na hora de sobrescrever esse método para evitarmos problemas maiores, vamos entender melhor sobre elas.

Preste atenção

Reflexiva: Garantir que o objeto será igual a ele mesmo quando comparado pelo equals, ex x.equals(x) deve retornar true;

Simétrica: dois objetos quaisquer devem chegar em um acordo sobre sua igualdade, nesse ponto precisamos garantir que estamos pensando em todos os cenários;

Transitiva: Se o objeto de comparação é igual a um segundo objeto, e o segundo objeto é igual a um terceiro objeto, logo se compararmos o primeiro e o terceiro objeto o método equals deve informar que eles são iguais;

Consistente: Uma vez que o equals identifica que dois objetos são iguais, ele deve sempre retornar que são iguais a menos que um dos objetos seja modificado após isso.

E por fim a não nulidade , todo objeto comparado com null deve retornar false.

Como?

O livro traz dicas de como criar um método equals com alta qualidade.
1 - Use o operador == com prósito de verificar se o argumento é uma referência ao objeto;
2 - Use o operador instanceod para verificar se o argumento apresenta o tipo correto;
3 - Faça o cast do argumento para o tipo correto;
4 - Para cada campo significativo na classe, verifique se o campo do argumento coincide com o correspondente do objeto;

Calma que tem mais...

Talvez a galera mais experiente desde o começo esta pensando, e o hashCode? Pois bem, além de sobrescrever o equals, sempre tenha em mente que ao sobrescrever o equals você deverá sobrescrever o método hashCode.
E não substitua Object por outro tipo na assinatura do equals.
Essa ação é tão comum na vida dos desenvolvedores Java que algumas IDEs como Intellij já tem a opção de sobrescrever os dois e mostra de maneira fácil quais campos você deseja comparar e quais campos são obrigatórios na comparação e montam o método de maneira bem simples para o desenvolvedor.

Top comments (0)