O equals(Object obj) não é nada a ver do eclipse é um método da classe Object, da qual todos os objetos decendem direta ou indiretamente,
e ele não implementa automaticamente todos os ifs, se vc olhar a implementação dele na classe Object é essa:
[/quote]
Meus amigos, ninguém está falando do método equals tal como está implementado na classe Object, mas sim de uma implementação do equals feita por ele. Reescrever o método de uma classe pai, certamente sabem o que isso é, certo?
Se eu quero saber se dois objectos são iguais, tenho de reescrever a minha definição de igual. Mais correcto do que implementar um método comparar ou outra coisa qualquer é reescrever o equals para a entidade em causa.
O eclipse faz isso automaticamente com todos aqueles ifs e verificando se os campos estão a null para não dar NullPointerException. Pode também ser implementado com reflection mais ou menos como eu já pus atrás. Qualquer uma dessas formas funciona de certeza absoluta.
Implementação errada de equals? Porquê? O método equals é implementado da forma que eu quero para quando faço entidade1.equals(entidade2) devolva true quando pelas minhas regras forem iguais e devolva false quando forem diferentes.
Não. O método equals não é implementado da forma que vc quer. Ele é implementado segundo uma certa lógica.
Esta logica especifica que o método deve ter certas propriedades e que deve verificar se os objetos são equivalentes.
Objetos equivalentes não precisam ser iguais campo a campo. Claro que , objecto iguais campo a campo, são automáticamente equivalentes sob qq definição.
Comparar todos os atributos do método cegamente é errado para implementação de equals. Apenas os atributos relevantes devem ser comparados.
Se ainda não ficou claro, o que o colega quer é saber se o objeto foi modificado , por isso ele quer comparar todos os campos um a um, ele não quer saber se o objeto é equivalente, isso ele já sabe que é.
A situação é classica quando vc manda um objeto para edição e depois tem que descobrir se foi editado para saber se precisa mexer em outras coisas, nomalmente o banco.
Existem tecnicas melhores que a comparação campo a campo (proxy dinamico), mas a comparação campo a campo tb funciona e é menos intrusiva. É um simples loop que compara os campos… não é rocket cience… nem é a implementação de equals.
Certo, concordo que o método equals não deve verificar todas as propriedades. Cabe a cada programador decidir, segundo as suas regras de negócio de quais são a propriedades necessárias.
O que ele precisa então será de implementar o compareTo, não?
[quote=pmlm]Certo, concordo que o método equals não deve verificar todas as propriedades. Cabe a cada programador decidir, segundo as suas regras de negócio de quais são a propriedades necessárias.
O que ele precisa então será de implementar o compareTo, não?
[/quote]
Tb não. compareTo é para estabelecer ordem de maior e menor.
O método que ele precisa não é da classe. É um método utilitário que compara objetos quaisquer campo a campo.
public static <T> isModified ( T original, T edited){
// true se edited é diferente em algum detalhes de original
}
[quote=sergiotaborda][quote=pmlm]Certo, concordo que o método equals não deve verificar todas as propriedades. Cabe a cada programador decidir, segundo as suas regras de negócio de quais são a propriedades necessárias.
O que ele precisa então será de implementar o compareTo, não?
[/quote]
Tb não. compareTo é para estabelecer ordem de maior e menor.
O método que ele precisa não é da classe. É um método utilitário que compara objetos quaisquer campo a campo.
[code]
public static isModified ( T original, T edited){
// true se edited é diferente em algum detalhes de original
}
[/code][/quote]
concordo, compareTo não server nesse caso e sim para ordenar coleções