image

Acesse bootcamps ilimitados e +650 cursos pra sempre

60
%OFF
Article image

JV

Joston Veiga22/08/2023 22:46
Compartilhe
Nexa - Análise Avançada de Imagens e Texto com IA na AWSRecomendados para vocêNexa - Análise Avançada de Imagens e Texto com IA na AWS

Porque devemos sobrescrever o método equals do Java em nossas classes?

  • #Java

Neste artigo vamos ver o que acontece quando tentamos comparar dois objetos para verificar se são iguais sem sobrescrever o método equals e como podemos sobrescrever este método para obtermos o resultado esperado.

Primeiro, vamos tentar comparar dois objetos sem sobrescrever o método equals.

Vamos criar uma classe pessoa.

class Person{

 private String name;
 
 public Person(String name){
  this.name = name;
 }
   
 public String getName() {
  return name;
}
}

Agora vamos criar duas instâncias dessa classe com os mesmos dados.

Person person1 = new Person("Pedro");
Person person2 = new Person("Pedro");

Como fazemos para determinar se person1 é igual a person2?

Olhando para o código acima podemos dizer que os nossos objetos são iguais, pois os dois são do tipo Person e tem no atributo name o valor “Pedro”. Mas veja o que acontece quando tentamos comparar as nossas instâncias usando o método equals.

person1.equals(person2) // false

A nossa comparação retorna falso. Como assim!? Como retorna falso se os dois objetos são iguais?

Vamos entender o porquê desse comportamento.

Perceba que não escrevemos o método equals em nossa classe Person mas temos esse método disponível em nossa classe. Isso acontece porque toda classe em Java tem como superclasse a classe Object, então, toda classe herda/implementa os métodos contidos nela. Ao chamar o método equals estamos executando o algoritmo que está escrito na classe Object que é implementado da seguinte forma:

public boolean equals(Object obj) {
return (this == obj);
}

Mas porque esse método não consegue comparar o nosso objeto de maneira correta?

Isso acontece porque o que esse método faz é verificar se o objeto passado no parâmetro é o mesmo objeto, se é a própria instância dele, se Person1 tem o mesmo endereço de memória de Person2 e não se o valor ou valores dos objetos são iguais. É por esse motivo que não devemos comparar classes com o operador de igualdade(==).

Para reforçar a ideia, se tentássemos comparar nossos objetos dessa forma Person1 == Person2 não daria certo.

Agora que vimos a importância de sobrescrever o método equals, podemos sobrescrevê-lo da seguinte maneira:

@Override
 public boolean equals(Object o) {
 if(!(o instanceof Person person)){
   return false;
 }
 return Objects.equals(this.name,person.getName());
}

Primeiro verificamos se o objeto em comparação também é do tipo Person e depois comparamos os atributos dos dois objetos.

O código completo de nossa classe ficou assim:

class Person{

 private String name;
 
 public Person(String name){
 this.name = name;
 }
 
 public String getName() {
 return name;
 }
 
 @Override
 public boolean equals(Object o) {
 if(!(o instanceof Person person)){
   return false;
 }
 return Objects.equals(this.name,person.getName());
 }
}

Agora se chamarmos o método de comparação ele retornará o resultado esperado.

person1.equals(person2) // true

A comparação agora retorna verdadeiro pois person1 e person2 são do mesmo tipo a classe Person e o atributo name tem o mesmo valor Pedro.

Neste artigo vimos a importância de sobrescrever e utilizar o método equals para comparar classes corretamente no Java.

Compartilhe
Recomendados para você
Deal - Spring Boot e Angular (17+)
Cognizant - Arquitetura com Spring Boot e Cloud
Claro - Java com Spring Boot
Comentários (2)
Arthur Felipe
Arthur Felipe - 23/08/2023 13:49

isso foi bem esclarecedor, parabéns!

Eduarda Clemente
Eduarda Clemente - 23/08/2023 08:37

Nossa eu necessitava de um conteúdo como esse. Parabéns e continue assim!

Recomendados para você