DEV Community

Paula Santana
Paula Santana

Posted on • Edited on

5

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.

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read more

Top comments (0)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up