domingo, 11 de setembro de 2011

Dicas de Programação: Como copiar dados de um bean ao outro em Java?

Não há nada mais trabalhoso do que copiar os dados de um bean ao outro, sendo que estes tem os mesmos nomes nas propriedades...

Por exemplo:

@Entity
@Table(name="CLIENTE")
public class Cliente {
       private String nome;
       private String endereco;
       ...
}

@WebForm
public class ClienteForm {
       private String nome;
       private String endereco;
       ...
}

Se as classes tiverem uns 100 campos, eu precisaria obter e colocar os dados, um por um (ou seja, fazer get e set de todos os campos...), 100 vezes!

Ai, as pessoas perguntam/respondem (dependendo do entendimento): "Não é para isso que serve o estagiário?"

Ai, eu respondo: "Não, não é para isso que serve o estagiário!" :P

Sei que é muito mais rápido na execução de um programa se não usarmos reflexão (eu já falei disso? Se não falei, seria um ótimo assunto para um próximo post :) ) mas, neste caso, acho muito mais fácil utilizá-la do que fazer um monte de get e set (sei lá, dependendo do caso, o código fica até mais bonito...).

Bem, já escrevi demais, vamos ao código:

public class ObjectUtil {

//Método que copia os campos de um objeto a outro.
public static void copyFields(Object from, Object to) {
        //Obtenho os campos que estão declarados no objeto de origem
        Field fields[] = from.getClass().getDeclaredFields();
        for (Field fromField: fields) {
                try {
                      //Obtenho o campo do objeto de destino que possue o mesmo nome do campo do objeto de origem
                      Field toField = to.getClass().getDeclaredField(fromField.getName());
                     //Modifico a acessibilidade...
                      toField.setAccessible(true);
                      fromField.setAccessible(true);
                      //Obtenho o valor do campo do objeto de origem
                      Object value = fromField.get(from);
                       //Coloco o valor no campo do objeto de destino
                       toField.set(to, value);
                } catch (Exception e) {
                       //Se der erro, não copio e passo para o próximo campo
                }
        }
}

}

Hum... Será que isso funciona bem?

Até mais!

Um comentário:

Anônimo disse...

Existem algumas libs para isso: http://stackoverflow.com/a/1432956