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;
}
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);
}
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)