Bom dia,
Aconteceu algo confuso hoje, buscava 5 linhas do banco de dados, cujo a classe de cada objeto destes tem implementado corretamente o equals e hashCode, e as colocava em um conjunto, percorria este conjunto (Set), e lá existiam 5 registros. Necessitei ordenar estes dados para fazer um agrupamento por poucos campos destes objetos, logo implementei o Comparable e sobreescrevi o compareTo, e a surpresa, apenas 2 registros eram adicionados no Set. conferi no livro da certificação Java e lá estava que o método equals era responsável por validar se um objeto já existia em um conjunto ou não, logo não entendi onde foi o ponto que ocorreu, parece que o método compareTo se sobrepôs ao equals no conjunto, alguém poderia me explicar isto?
[quote=dudu795]Bom dia,
Aconteceu algo confuso hoje, buscava 5 linhas do banco de dados, cujo a classe de cada objeto destes tem implementado corretamente o equals e hashCode, e as colocava em um conjunto, percorria este conjunto (Set), e lá existiam 5 registros. Necessitei ordenar estes dados para fazer um agrupamento por poucos campos destes objetos, logo implementei o Comparable e sobreescrevi o compareTo, e a surpresa, apenas 2 registros eram adicionados no Set. conferi no livro da certificação Java e lá estava que o método equals era responsável por validar se um objeto já existia em um conjunto ou não, logo não entendi onde foi o ponto que ocorreu, parece que o método compareTo se sobrepôs ao equals no conjunto, alguém poderia me explicar isto?
[/quote]
Vc deve ter trocado a implementação do set que estava usando de HashSet para TreeSet. Pois só assim vc precisaria do CompareTo. Vc não precisava fazer isso. Vc pode usar um Comparator em vez de implementar Comparable.
Isso deixa vc usar qualquer ordem que vc quiser. Quando vc implementa comparable vc está dizendo que o objeto tem uma ordem inerente. E isto pode não ser verdade. Numeros têm ordem inerente, Produtos e Clientes não.
Veja que em geral nada obriga que a.equals(b) == true então , a.compareTo(b) == 0. Esta regra não existe. O BigDecimal, por exemplo, não a segue.
equals significa : são da mesma classe têm o mesmo estado ?
compareTo significa : representam o mesmo valor ?
O BigDecimal representa valores iguais com estados diferentes e por isso os métodos não casam. Quando isto acontece diz-se que “o método compareTo não é compativel com equals”.
Agora, normalmente vc quer que seja, a menos que existam boas razões para que não.
Sem sabermos do codigo fica dificil dizer mais alguma coisa