DEV Community

Paula Santana
Paula Santana

Posted on • Edited on

14 1

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)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up