Equals, Hashcode, ToString,Comparable e Comparator.Desmistificando o Conhecimento - 2010Rodrigo Cascarrolhotwitter.com/rodrigocasca
MotivaçãoAumento da qualidade do software.Nivelamento do conhecimento.TécnicoConceitualProcessoEquipe com aprendizado contínuo.Gerar o hábito de questionar:Como vou implementar isso?Como vou testar isso?Como melhorar o processo?Refactoring...Aumentar a compreensão do domínio.
ObjectTodas as classes estendem Object.Os métodos não-finais foram projetados para serem estendidos.Os contratos DEVEM ser obedecidos.
ObjectTodas as classes estendem Object.Os métodos não-finais foram projetados para serem estendidos.Os contratos DEVEM ser obedecidos.
Pojo
equals()Quando NÃO usar:A classe é única (Ex: Thread)Não há interesse em teste lógico.Superclasse já possui equals().Classe privada.Quando USAR:Quando precisamos de igualdade lógica.Onde será usado?Comparação lógica de objetos.Chave de conjuntos.
equals()ContratoReflexivox.equals(x) returntrue;Simétricox.equals(y) returntrue;y.equals(x) returntrue;Transitivox.equals(y) returntrue;y.equals(z) returntrue;x.equals(z) returntrue;ConsistenteVárias chamadas retornam o mesmo valor (true ou false)x.equals(null) returnfalse;Atributos derivados podem ser ignoradosAtençãoPrimitivos: usar ==Float: usar Float.compare(f1, f2);Double: usar Double.compare(d1, d2);
EqualsBuilderorg.apache.commons.lang.builder.EqualsBuilder;Se necessárioTwo Objects that compare as equals must generate the same hash code, but two Objects with the same hash code do not have to be equal.
hashCode()Sempre sobreponha hashCode ao sobrepor equals (contrato Object.hashCode).Objetos iguais devem ter o mesmo código hash.Usado em coleções baseadas em hash.Sempre que chamando, o código hash deve retornar o mesmo inteiro.Objetos diferentes podem ter o mesmo código hash.
hashCode()AtençãoFloat: usar Float.floatToInBits(f);Double: usar Double.doubleToInBits(d);
org.apache.commons.lang.builder.HashCodeBuilder;you pick a hard-coded, randomly chosen, non-zero, odd number ideally different for each class Se necessárioHashCodeBuilder
toString()Contrato: “representação concisa, mas informativa, que seja fácil para uma pessoa ler”“Pojo@f9f33525”Boa implementação torna a classe mais agradável de usar. Fácil???Texto: Teste toString Booleano: true Data: Fri Sep 10 01:44:47 BRT 2010
ToStringBuilderorg.apache.commons.lang.builder.ToStringBuilder;org.apache.commons.lang.builder.ToStringStyle;PojoBuilder@10b30a7[Texto=TESTE1,Lista=[1, 2, 3],Boolean=true,Data=09/09/2010]PojoBuilder@e09713[Texto=TESTE1,Lista=[1, 2, 3],Boolean=true,Data=09/09/2010]
ToStringBuilderorg.apache.commons.lang.builder.ToStringBuilder;org.apache.commons.lang.builder.ToStringStyle;
compareTo()Indica a ordem natural da classe.Permite comparações em ordem.Contrato:Mesmo contrato usado no equals.(x.compareTo(y) == 0) == (x.equals(y))Quando violado o contrato, podem invalidar outras classes, como as coleções ordenadas TreeSet e TreeMap e classes utilitárias Collection e Arrays.Exemplo:Collections.sort(lista);
CompareToBuilderorg.apache.commons.lang.builder.CompareToBuilder;
ComparatorNecessitamos de ordenação diferente da ordenação padrão da classe.Necessitamos de mais de um tipo de ordenação para a classe.
TipoOrdenaçãoComparatorAdminAlunosComparator comparator = new AdminAlunosComparator(column, ascending);Collections.sort(lista, comparator);
FimObrigado!

Equals, Hashcode, ToString, Comparable e Comparator