| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/10/2007 10:34:07
|
lgi2020
Virtual Machine Man
![[Avatar]](/images/avatar/1ac978c8020be6d7212aa71d4f040fc3.jpg)
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
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/10/2007 10:49:21
|
jgbt
GUJ Master
![[Avatar]](/images/avatar/25df35de87aa441b88f22a6c2a830a17.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/10/2007 10:51:24
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/10/2007 10:55:25
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/10/2007 12:00:53
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/10/2007 12:43:35
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/10/2007 12:44:58
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/10/2007 13:14:43
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/10/2007 13:49:51
|
lgi2020
Virtual Machine Man
![[Avatar]](/images/avatar/1ac978c8020be6d7212aa71d4f040fc3.jpg)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/10/2007 14:05:36
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/10/2007 14:43:04
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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 |
|
|
 |
|
|