segunda-feira, 20 de setembro de 2010

Effective Java 6.

A melhor forma de não errar ao sobrescrever os métodos equals é não sobrescrevê-lo, e acredite, essa será a melhor opção quando: Cada instância da classe herda de unique, você não se importa com o teste para verificar se duas instancias são igual, uma outra classe sobrescreve o método equals e esse comportamento é adequado e herdado pela nova classe e uma classe privada ou privada em um pacote sendo que o método equals nunca será usado.
Ok, agora que já sabemos quando não devemos sobrescrever o e pergunta óbvia é , quando sobrescrevê-lo então? Bem, devemos sobrescrever o método com equals quando a nossa classe tiver um comportamento específico de comparação e nenhum de suas superclasses tenha implementado esse comportamento.
Agora que vimos quando implementar e quando não implementar o método equals, devemos ter conhecimento do contrato estabelecido para esse método, resumidamente, o método equals deve:
Ser reflexivo: Para qualquer valor de x, a sentença x.equals(x) deve retornar verdadeiro sempre. Ser simétrico: Para qualquer valores de x e de y, a sentença x.equals(y) deve retornar verdadeiro, se e somente se, y.equals(x) retornar verdadeiro. Ser transitivo: Para qualquer valores de x,y e z, se x.equals(y) retornar verdadeiro e y.equals(z) retornar verdadeiro, x.equals(z) dever retornar verdadeiro.Ser consistente: Para qualquer valor de x e de z, caso x.equals(z) retorne verdadeiro ou falso para chamadas o método equals deve retornar verdadeiro ou falso consitentemente. Para qualquer valor de x, a sentença x.equals(null) deve retornar falso sempre.
Então quando for sobrescrever o método equals, faça as seguintes perguntas a si mesmo: A minha implementação do método equals é simétrica? É transitiva? É consistente? As outras duas cláusulas, normalmente tomam conta de si mesmas.
Para finalizar considere as seguintes afirmações: Sempre que sobrescrever o método equals, também sobrescreva o método hasCode, Não escreve métodos equals that relies on unrealiable resourses e não substitua a classe Object por outra classe na assinatura do método equals.