Java Efetivo Essencial - Equals
Tags: java, backend, programming
Published: 2022-08-15 23:46:10

## 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.