image

Acesse bootcamps ilimitados e +650 cursos

50
%OFF
Article image

JV

Joston Veiga22/08/2023 22:46
Compartilhe

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

    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
    Comentários (2)
    Arthur Felipe
    Arthur Felipe - 23/08/2023 13:49

    isso foi bem esclarecedor, parabéns!

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

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