Boa tarde,
Tenho dois objetos do tipo Cliente e preciso comparar os atributos de cada um se mudo algo. Tipo
clienteNew.getNome().equals(clienteOld.getNome())
mas esta entidade possui 60 atributos tem um jeito mais fácil de fazer do que fazer um for e fazer if para cada atributo para ver qual mudo.
Espero ter sido o mais claro possivel
[]'s
criador
Outubro 14, 2009, 5:40pm
#2
Então você tem um array de clientes (Cliente[]) ?
Abraço!
um objeto com 60 atributos??? ou são 60 objetos em um array?
[quote=guilhermetonetto]Boa tarde,
Tenho dois objetos do tipo Cliente e preciso comparar os atributos de cada um se mudo algo. Tipo
clienteNew.getNome().equals(clienteOld.getNome())
mas esta entidade possui 60 atributos tem um jeito mais fácil de fazer do que fazer um for e fazer if para cada atributo para ver qual mudo.
Espero ter sido o mais claro possivel
[]'s[/quote]
http://commons.apache.org/beanutils/
nao é um array de objetos e sim dois objetos Cliente e eu quero comparar os atributos se é diferente ou não
pmlm
Outubro 15, 2009, 5:17am
#7
Implementa o equals. O Eclipse faz isso automaticamente.
criador
Outubro 15, 2009, 8:32am
#8
Poste seu código para melhor visualização do seu problema.
Abraço!
o Eclipse faz automaticamente o código de comparação de dois objetos ?
kenneth
Outubro 15, 2009, 9:06am
#10
Fala cara…
Eu concordo com o marcosharbs …
Se vc quer fazer uma coisa mais dinamica, pode usar reflection…
Vc pode ler os metodos da classe e invoca-los em tempo de execucao…
Da uma olhada:
http://www.guj.com.br/article.show.logic?id=10
Abraco!
pmlm
Outubro 15, 2009, 10:12am
#11
No eclipse, na classe Cliente, botão direito :arrow: Source :arrow: Generate hashCode() and equals()
Depois, onde queres comparar é so fazer
if(clienteNew.equals(clienteOld))
renamed
Outubro 15, 2009, 10:18am
#12
[quote=pmlm]No eclipse, na classe Cliente, botão direito :arrow: Source :arrow: Generate hashCode() and equals()
Depois, onde queres comparar é so fazer
if(clienteNew.equals(clienteOld))
[/quote]
mto BOA DICA!!!
valeu ae pessoal!
Vou dar uma olhada em reflection e beanutils quando sobrar um tempo. Já implementei no modo tradicional com if e else if’s
valeu pelas dicas
[]'s a todos
Equals não faz o que vc quer. Vc tem que utilizar reflection. Pegar todos os campos e comparar
algo assim :
public boolean compare (Cliente a , Cliente b){
Field[] fields = Cliente.class.getFiedls();
for (Field f : fields ){
if (! f.getValue(a).equals(f.getValue(b)){
return false; // não são iguais
}
}
return true; // são iguais.
}
pmlm
Outubro 15, 2009, 12:56pm
#15
O equals faz exactamente o que ele quer, se for correctamente implementado na entidade.
Há duas formas de implementar o equals:
automaticamente pelo eclipse.O eclipse pergunta quais os campos que devem ser iguais para o equals dar true e implementa automaticamente todos os ifs
usando reflection, que poderá ser mais ou menos assim (não testei o código)
import org.apache.commons.lang.builder.EqualsBuilder;
(...)
public boolean equals(Object other) {
if (other == null) {
return false;
}
if (!(other.getClass().isInstance(this))) {
return false;
}
EqualsBuilder builder = null;
for (Field f : this.getClass().getFields()) {
builder.append(f.get(this), f.get(other));
}
if (builder == null) {
return super.equals(other);
}
return builder.isEquals();
}
automaticamente pelo eclipse.O eclipse pergunta quais os campos que devem ser iguais para o equals dar true e implementa automaticamente todos os ifs
???
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:
public boolean equals(Object obj) {
return (this == obj);
}
se não me engano ele compara se os dois objetos estão referenciando o mesmo lugar de memória,
tanto que se por exemplo vc tiver uma classe Usuario e um atributo nome nessa classe
e criar duas instancias da classe Usuario e setar o mesmo nome pros dois e der um equals ele vai dar false
so se vc claro sobrescrever o metodo equals nessa classe pra retorna true se os dois nomes forem iguais
[quote=pmlm]O equals faz exactamente o que ele quer, se for correctamente implementado na entidade.
[/quote]
Não. É exatamente isso que estou dizendo. Se ele implementar equals corretamente , equals não fará a comparação de todos os campos.
Nunca se implementa equals via reflection. Não porque é tecnicamente impossivel, mas porque é logicamente errado.
O método equals não compara todos os atributos do objeto. Isso é uma implementação errada de equals.
Equals diz se os objetos são equivalentes. O que o colega quer é saber se eles são exatamente iguais campo a campo, não apenas equivalentes.
é tipo oq eu quero é que isso aconteça.
cliente.getNome().equals(clienteOld.getNome())
mas tem outro problema é que o equals quando tem
cliente.getCep().getNumeroCep().equals(clienteOld.getCep().getNumeroCep())
nesse código eu vejo o problema de que se o getCep() for nulo vai dar nullpointer e se eu comparar assim
cliente.getCep().equals(clienteOld.getCep())
sempre serão diferentes, pois até onde eu sei ele compara os endereços e não os valores.
cliente.getCep().equals(clienteOld.getCep())
na verdade isso num vai ser diferente (se as Strings forem iguais) pois vc está comparando duas Strings, imagino que o atributo cpf deve ser uam String,
agora se fizer cliente.equals(clienteOld) vai retornar false pois devem ser duas instancias diferentes de objeto
neste caso o getCep() seria um objeto dentro de cliente , claro q isso é um exemplo.