DEV Community

Paula Santana
Paula Santana

Posted on • Updated on

Java Efetivo Essencial - HashCode()

Sobrescreva sempre o método Hashcode ao sobrescrever o método equals

Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo.

Entendendo

Assim como o método Equals(), o método Hashcode() também é herdado da classe Object.
Esse método é utilizado especialmente em estrutura de dados do Java, como na api de Collections e Map.
Em caso de você sobrescrever o Equals() e não sobrescrever o Hashcode() estará violando o contrato geral do método Hashcode() e implicará no mal funcionamento dessas estruturas de dados no Java.

Contrato Geral

Existem algumas regras que devem ser respitadas pelo método Hashcode():

  • Sempre que um método hashcode for executado repetidas vezes para o mesmo objeto deve sempre retornar o mesmo valor desde que nenhum dos dados usados no equals seja modificado;
  • Se dois objetos forem iguais através do método equals então o método hashcode desses objetos deve retornar o mesmo valor;
  • Se dois objetos não forem iguais no método equals(), não é necessário que o resultado do hashcode() seja diferente dos dois, porém é importante o programador entender que resultados diferentes melhora o desempenho de tabelas hash utilizadas nas estrutura de dados do Java;

Como deveria ser?

Não é preciso incluir campos do objeto não utilizado no método Equals().
Utilizar a mesma ordem dos campos possibilita uma função hash melhor.
Se calcularmos o Hash na mão o recomendado pelo livro é utilizar um número primo, como no exemplo abaixo:

@Override
public int hashCode() {
  int result = nome.hashCode();
  result = 31 * result + email.hashCode();
  result = 31 * result + nascimento.hashCode();
  return result;
}
Enter fullscreen mode Exit fullscreen mode

Existem bibliotecas que realizam o calculo do hash de maneira mais segura, o livro recomenda o Guava do Google e também a da própria classe Objects do Java.
Ele traz apenas um alerta sobre o método da classe Objects em termos de performance.

@Override
public int hashCode() {
    return Objects.hash(nome, email, nascimento);
}
Enter fullscreen mode Exit fullscreen mode

Se trabalha com classes Imutáveis uma abordagem seria o armazenamento do hashcode em cache para não ficar recalculando toda vez que o método for utilizado.

Concluindo

O livro ressalta a importância de utilizarmos todos os campos que são significativos para identificar o objeto, ou seja, mesmo que sejam muitos devemos manter eles e garantir que estes sejam presentes.

Entenda que sempre que sobrescrever um método será necessário sobrescrever o outro para que seu programa funcione corretamente.
Obdeça na sobrescrita as regras que esse método deve atender.

Algumas IDEs facilitam isso para o desenvolvedor como é o caso do Intellij que já possui uma opção em conjunto de sobrescrita dos dois itens.

Top comments (0)