Olá desenvolvedores, hoje vamos falar sobre os métodos equals e hashCode, respectivamente. Entenderemos o que são estes métodos, porque utilizá-los e como implementar. Estes métodos compreendem um conjunto de dúvidas muito comuns para o programador iniciante. Mas hoje, vamos tentar elucidar todas as suas dúvidas.
O método equals() nos permite verificar uma comparação entre os objetos. Tal comparação tem a finalidade de verificar se o valor/tipo dos atributos que estão sendo comparados são iguais. Isto é, é através do método equals() que você poderá determinar se os objetos são iguais.
Já o hashCode() é uma ferramenta da JVM – Java Virtual Machine usado para montar a tabela hash de modo correto. Em outras palavras, temos que elementos podem ser armazenados em estruturas onde a informação é referenciada por uma chave. Esta chave, que também podemos chamar de “número hash”, é calculada com base nas propriedades da informação. Veja o exemplo abaixo.
Suponha que um cliente responsável pela organização de um congresso, solicite que todos os participantes sejam cadastrados. Entretanto, a fim de evitar confusão quanto ao lugar que eles ocuparão durante a conferência, o cliente pensa em uma solução. É preciso gerar uma chave única para cada participante indicando, inclusive o seu lugar, previamente determinado.
Assim sendo, a solução aponta para a criação de um cadastro. Tal cadastro a partir da quantidade de letras do nome, multiplicada por 8, geraria uma chave individual com o posicionamento de cada participante. A este processo damos o nome de (Ordenação precisa de comparação) em uma tabela hashing.
Enfim, sempre que precisarmos ordenar e comparar objetos Java em tempo de execução os métodos equals e hashcode deverão ser implementados. Sempre levando em consideração os atributos que devem fazer parte, claro, em concordância com cada sistema e regra de negócio.
DIFERENCIANDO OBJETOS
Agora que você já sabe o que são estes métodos e como utilizá-los, vamos a implementação. A exemplo do que fizemos em “TOSTRING: CONHEÇA O MÉTODO”, comente seu código, deixando apenas dois objetos do tipo aluno instanciados.
Aluno aluno01 = new Aluno();
Aluno aluno02 = new Aluno();
O objetivo agora é diferenciar objetos. A diferenciação de objetos é útil e se aplica quando, por exemplo, é necessário remover um objeto de uma lista. E não apenas, distingui-los pode ser útil também para encontrarmos objetos duplicados, e por conseguinte remover o objeto duplicado.
Assim, os respectivos métodos equals e hashcode se aplicam quando precisamos distinguir, ordenar e comparar objetos.
Se “setarmos” o mesmo nome para cada um dos objetos criados. Mesmo estando referenciando lugares distintos na memória, podemos dizer que temos um objeto duplicado. Uma vez que, além do nome (que se repete), não há outra informação pra distingui-los. Assim sendo, visualmente os objetos são os “mesmos”.
Dessa forma, é lógico dizer que se compararmos os dois objetos teremos um retorno do tipo “true”. Ou seja, os dois objetos são iguais, correto? Bom, vamos ver na prática o que acontece. Atribua o mesmo nome para ambos os objetos.
Aluno aluno01 = new Aluno();
Aluno01.setNome("Alex")
Aluno aluno02 = new Aluno();
aluno02.setNome("Alex");
O objeto abaixo nos permitirá comparar os dois objetos e retornar se eles são ou não iguais. Para procederemos com a comparação utilizaremos o método equals(). O método equals() retorna um boolean, ele irá comparar um objeto com o outro e retornar “true” ou “false”.
Vamos ao código. Se os objetos forem iguais, será exibido no console a mensagem “ALUNO DUPLICADO”. Entretanto, se os objetos forem distintos, a mensagem exibida será, “OK! NÃO HÁ DUPLICAÇÃO”.
CONCLUSÃO
Opa! Não há duplicação? Exatamente. Isso ocorre porque o Java diferencia os objetos em tempo de execução por meio de um código que roda na memória.
Dessa forma, para garantirmos que estes objetos são iguais, é preciso informar esta condição ao código. Ao fazê-lo estaremos assegurando a regra de negócio. Para tanto, precisaremos sobrescrever os métodos equals() e hashCode().
GERANDO O MÉTODO EQUALS E HASHCODE
Em uma área livre da classe Aluno, clique com o botão contexto do mouse e escolha, .
A título de exemplo na janela “Generate hashCode() and equals()” deixe somente o “nome” selecionado e clique em [Generate].
Observe os códigos que foram gerados. Em tempo de execução será gerado uma chave ou um número hashCode, que será usado exclusivamente pelo Java.
Tendo gerado o código, volte ao método main e execute novamente a aplicação. O retorno agora será “ALUNO DUPLICADO”.
EM POUCAS PALAVRAS
Somente após a implementação dos métodos poderemos garantir que objetos que compartilham o mesmo nome, por exemplo, serão sempre iguais. Obviamente se o nome for o nosso único parâmetro de comparação.
Este é um recurso amplamente utilizado no Java, a partir do qual poderemos determinar qual objeto será excluído ou qual será gravado no banco de dados.
A recomendação é, da mesma forma como fazemos com o método toString, sugiro a implementação dos métodos hashCode e equals. Que aliás andam juntos. No entanto, ao fazê-lo defina o atributo que irá diferenciar os objetos.
E neste caso, é melhor definir também um segundo atributo de diferenciação, como o cpf, por exemplo. Haja visto os inúmeros casos de ocorrência de homônimos. Assim, é uma boa prática estabelecer também o CPF como atributo de distinção entre objetos.
Fica para você o desafio da implementação, atribuindo agora também o número do CPF. Eu fico por aqui. Obrigado e até o próximo.