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.