Tratamento automático e genérico de listas utilizando Generics

1 resposta
palerique

Caros, recetemente precisei converter uma lista de um objeto VO em uma lista de objeto POJO, dai vi que o processo era semelhante para uma pá de listas que temos nos sistema e pensei em criar um método genérico com um converso e várias sobrecargas para lidar com cada uma das possibilidades de lista.

O código está abaixo, mas antes que vocês vejam quero fazer logo a pergunta, como é que eu faço isso? Tem jeito? Claro que tem que ser uma solução viável do ponto de vista da performance. Está ai o desafio!

No meu exemplo ou eu esbarro na generalização e a possibilidade de ClassCastException e listas com vários objetos ou eu esbarro na desgeneralização o que implica fazer um método para cada tipo de lista que quero converter. Bom, basicamente o mais longe que eu cheguei até agora foi o seguinte código:

package testesComGenerics;

import java.util.ArrayList;
import java.util.List;

public class TestesComGenerics {

	public static void main(String[] args) {

		ObjetoVO objetoVO1 = new ObjetoVO();
		ObjetoVO objetoVO2 = new ObjetoVO();
		ObjetoVO objetoVO3 = new ObjetoVO();
		
		objetoVO1.nome = "Objeto1";
		objetoVO2.nome = "Objeto2";
		objetoVO3.nome = "Objeto3";

		ObjetoVO2 objetoVOa = new ObjetoVO2();
		ObjetoVO2 objetoVOb = new ObjetoVO2();
		ObjetoVO2 objetoVOc = new ObjetoVO2();
		
		objetoVOa.numero = 1;
		objetoVOb.numero = 2;
		objetoVOc.numero = 3;
		
		List<ObjetoVO> listaVO = new ArrayList<ObjetoVO>();
		List<ObjetoVO2> listaVO2 = new ArrayList<ObjetoVO2>();
		
		listaVO.add(objetoVO1);
		listaVO.add(objetoVO2);
		listaVO.add(objetoVO3);
		
		listaVO2.add(objetoVOa);
		listaVO2.add(objetoVOb);
		listaVO2.add(objetoVOc);
		
		List<ObjetoPOJO> listaPOJO = retornaLista(new ArrayList<ObjetoPOJO>(), listaVO);
		List<ObjetoPOJO2> listaPOJO2 = retornaLista(new ArrayList<ObjetoPOJO2>(), listaVO2);//Aqui falha!!!
		
		for (ObjetoPOJO objetoPOJO : listaPOJO) {
			System.out.println(objetoPOJO.nome);
		}
		
		for (ObjetoPOJO2 objetoPOJO2 : listaPOJO2) {
			System.out.println(objetoPOJO2.numero);
		}
		
	}
	
	@SuppressWarnings("unchecked")
	static <T extends ObjetoPOJO , K extends ObjetoVO> List<T> retornaLista(List<T> listaPOJO, List<K> listaVO){
		//Aqui eu tive que extender para garantir que a minha lista só teria um mesmo tipo de objeto

		for(K o: listaVO){
			
			listaPOJO.add((T) converterVOtoPOJO(o));
			
		}
		
		return listaPOJO;
	}
	
	static ObjetoPOJO converterVOtoPOJO(ObjetoVO objetoVO){
		
		ObjetoPOJO objetoPOJO = new ObjetoPOJO();
		
		objetoPOJO.nome = objetoVO.nome;
		
		return objetoPOJO;
	}

	static ObjetoPOJO2 converterVOtoPOJO(ObjetoVO2 objetoVO2){
		
		ObjetoPOJO2 objetoPOJO2 = new ObjetoPOJO2();
		
		objetoPOJO2.numero = objetoVO2.numero;
		
		return objetoPOJO2;
	}

}

class ObjetoVO {
	
	String nome;
	
}

class ObjetoPOJO {
	
	String nome;
	
}

class ObjetoVO2 {
	
	int numero;
	
}

class ObjetoPOJO2 {
	
	int numero;
	
}

Thx,

PH

1 Resposta

Raphael_Lacerda

bom

vc pode usar a API Reflection, descobrir o atributos do seu objeto( tanto VO, como PO)
e se eles seguirem o padrão java bean (o q vai facilitar)
chamar os respectivos getters/ setters

acho q assim tu consegue irmão

Criado 2 de julho de 2010
Ultima resposta 3 de jul. de 2010
Respostas 1
Participantes 2