Implementação public boolean Equals(Object o)  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
lgi2020
Virtual Machine Man
[Avatar]

Membro desde: 19/07/2006 10:51:13
Mensagens: 550
Localização: Rio de Janeiro
Offline

Amigos,

Qual das duas implementações de equals é melhor (ambas são válidas)?
Peço que justifiquem a escolha.




Abraços a todos.

This message was edited 2 times. Last update was at 31/10/2007 10:35:57


Lennon Jesus | CSM | SCJP
http://twitter.com/LennonJesus
[WWW]
jgbt
GUJ Master
[Avatar]

Membro desde: 04/06/2003 15:01:48
Mensagens: 1286
Localização: Porto Alegre/RS
Offline

a primeira. o primeiro teste de equals sempre deve ser se o objeto passado como paramtro é uma instancia do objeto corrente.
a segunda, sem testar acho que não vai funcionar como o esperado.

[]'s

João Bier
Desenvolvedor Java
[Email]
hugov
JavaEvangelist

Membro desde: 30/08/2004 14:14:23
Mensagens: 357
Offline

Na primeira implementação de equals está faltando comparar seu o object != null , para depois
efetuar as outras comparações.

Vitor Hugo
Analista Desenvolvedor Java
WebLog : http://emdia.wordpress.com/
Skype : hugov_br
[Email] [WWW] [MSN]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Bom, instanceof já compara com null (null instanceof algumaclasse é sempre false).

Mas a primeira viola o contrato de equals, porque não é simétrica. (Deixo isso como exercício; pense em dois objetos, uma de uma classe X, e outra de uma subclasse Y. )

De modo geral, se você precisa comparar dois objetos com equals, eles têm de pertencer à mesma classe. A segunda já não viola esse contrato.
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Uma dica sobre o que o Thingol falou: A primeira seria válida se a classe fosse final.

Além disso, existe o capítulo 3 desse livro é uma ótima referência para quem quer entender direito o equals e o hashCode:
Effective Java

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

thingol wrote:Bom, instanceof já compara com null (null instanceof algumaclasse é sempre false).

Mas a primeira viola o contrato de equals, porque não é simétrica. (Deixo isso como exercício; pense em dois objetos, uma de uma classe X, e outra de uma subclasse Y. )



Porquê não é simetrica ?

x.id == y.id <=> y.id == x.id
[WWW]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

lgi2020 wrote:Amigos,




Não precisa usar if


Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

É mesmo sutil. Considere que y é um filho de x.
E que esse filho sobrescreve equals, fazendo a mesma implementação com o instanceof.

Ele pode até mesmo comparar os mesmos atributos.

Nesse caso, quando x.equals(y) será true (já que y instanceof x).
Mas quando y.equals(x) será false (já que x não é uma instância de y).

Mais detalhes link do Effective Java, que deixei ali em cima.

This message was edited 1 time. Last update was at 31/10/2007 13:17:07


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
lgi2020
Virtual Machine Man
[Avatar]

Membro desde: 19/07/2006 10:51:13
Mensagens: 550
Localização: Rio de Janeiro
Offline

Obrigado pelas respostas e dicas, amigos.

Abraços a todos.

Lennon Jesus | CSM | SCJP
http://twitter.com/LennonJesus
[WWW]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

ViniGodoy wrote:É mesmo sutil. Considere que y é um filho de x.
E que esse filho sobrescreve equals, fazendo a mesma implementação com o instanceof.

Ele pode até mesmo comparar os mesmos atributos.

Nesse caso, quando x.equals(y) será true (já que y instanceof x).
Mas quando y.equals(x) será false (já que x não é uma instância de y).

Mais detalhes link do Effective Java, que deixei ali em cima.


Entendi, mas se equals é def na classe pai ( vamos supor que o codigo acima está na classe pai)
seria final e assim:


Se B é filha de A



Ou seja "Classe" seria o nome da classe que define o método. Sendo assim dá certo, já que ou (1) A classe pai define equals e é final ou (2) as filhas definem e nesse caso nenhum A é igual a B nunca.
Não ?

This message was edited 3 times. Last update was at 31/10/2007 14:07:18


Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Sim, se a classe ou o equals forem final, daí beleza.

Acho que o problema maior é que geralmente não são. E como com o tempo criar um equals se torna um processo mais ou menos automático, o erro acaba sendo introduzido.

O importante é estar atento ao detalhe. Como diz o ditado popular:
"Deus está em todo lugar, mas o diabo está nos detalhes."

This message was edited 1 time. Last update was at 31/10/2007 14:43:46


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team