Comparar objetos

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 :slight_smile:

[]'s

Então você tem um array de clientes (Cliente[]) ?

Abraço!

um objeto com 60 atributos??? ou são 60 objetos em um array?

procure por reflection

[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 :slight_smile:

[]'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

Implementa o equals. O Eclipse faz isso automaticamente.

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 ?

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!

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=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 :slight_smile:

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.
}

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();
    }

???

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.