Tenho algumas tabelas no banco para as quais criei classes na aplicação.
Por exemplo, a tabela cliente, no banco possui os campos idCliente e nomeCliente.
Criei uma classe cliente com as variáveis de instância id e nome.
Precisarei armazenar um conjunto de cliente e pretendo utilizar hashCode.
Logo precisarei implementar equals e hashCode na classe Cliente.
Atualmente, meu método equals retorna true se o id for igual.
Meu método hashCode simplesmente retorna o id.
O contrato entre equals e hashCode está mantido.
E essa me parece uma boa estratégia. Pois objetos diferentes sempre estarão em “baldes” diferentes dentro do HashSet.
Pelo que entendo do HashSet, o ideal é que os objetos fiquem o mais espalhados possíveis, certo?
Ou tem alguma outra estratégia que pode otimizar isto?
Valeu!
Lembre-se que mesmo dois objetos com ids iguais podem ser diferentes se carregados duas vezes e alterados separadamente.
Mas a do hashcode faço exatamente igual.
O que deve ser considerado é o seguinte: Comparar os IDs é suficiente para estabelecer a igualdade entre os objetos? Isso faz sentido dentro do domínio que você está trabalhando ou foi feito só por economia de código?
Se a comparação apenas de ID for realmente o melhor a se fazer (e não o mais fácil, cuidado hein
), deixe desse jeito mesmo, está ótimo.
Senão, deve-se incluir os demais atributos na comparação do equals() e alterar o hashCode() para continuar respeitando o contrato.
[quote=Mark_Ameba]Lembre-se que mesmo dois objetos com ids iguais podem ser diferentes se carregados duas vezes e alterados separadamente.
Mas a do hashcode faço exatamente igual.[/quote]
A ideia do campo id na classe cliente é a mesma que o campo idCliente na tabela cliente: uma vez setado, não será mais alterado. Aliás só não marco o campo como final porque na hora de realizar a query não poderia setar o seu valor adequadamente.
Outra coisa. Se usar outras variáveis no equals é recomendável que as mesmas sejam usadas no hashCode.