Apesar de ser praticamente impossível atingir esse objetivo plenamente, é perfeitamente possível chegar a um resultado aproximado com a receita simples abaixo:
- Armazene um valor constante, de preferência um número primo, diferente de zero, por exemplo o 17, em uma variável do tipo int chamada 'r';
- Para cada campo/atributo 'f' significativo de seu objeto, isto é, cada campo/atributo levado em consideração pelo método equals, faça o seguinte:
- calcule um código hasc 'c' do tipo int para cada atributo:
- se o campo/atributo for boolean, calcule (f ? 1 : 0);
- se o campo/atributo for byte, char, short ou int, calcule (int) f;
- se o campo/atributo for um long, calcule (int) (f^(f>>>32));
- se o campo/atributo for um float, calcule Float.floatToInBits(f);
- se o campo/atributo for um double, calcule Double.doubleToLongBits(f) e, em seguida, encontre o hash do long resultante como no item 2.a.III;
- se o campo/atributo for um referência de objeto e o método equals dessa classe comparar o campo chamado equals de suas referências, chame também o hasCode de cada referência.
- combine o código hash 'c' encontrado no item 2.a com a variável 'r' do item 1, como abaixo:
r = 31 * r + c;
A seguir, os métodos de exemplo que devem ser introduzidos nos código das respectivas classes desenvolvidas até o presente momento ao longo desta disciplina.
Copyright © 2016 AIEC.