Foros del Web » Programación para mayores de 30 ;) » Java »

Planteamiento con Generics Java

Estas en el tema de Planteamiento con Generics Java en el foro de Java en Foros del Web. Buenas tardes, Quiero hacer un código que haga lo siguiente: recupere listados de una pantalla, y mapee los campos a mis objetos Java. El problema ...
  #1 (permalink)  
Antiguo 02/11/2013, 09:44
 
Fecha de Ingreso: julio-2008
Mensajes: 7
Antigüedad: 15 años, 9 meses
Puntos: 0
Planteamiento con Generics Java

Buenas tardes,

Quiero hacer un código que haga lo siguiente: recupere listados de una pantalla, y mapee los campos a mis objetos Java.

El problema esta, en que el metodo recuperarListados(...) no siempre devolverá el mismo tipo de listado, ni estos listados tendran siempre los mismos campos, os pongo un ejemplo de tipo de listado con sus campos:

Listado A
Nombre Apellidos Titulacion Edad

Listado B
DNI Direccion Empresa

Listado C
Solicitud Referencia Porcentaje Documentos Expedido

Bueno, una vez visto los ejemplos, lo que me gustaría hacer es "no repetir" el código que recupera estos listados, sino que con el mismo método me devuelva un listado, que luego usaré según el tipo que sea, es decir:

public ListadoGenerico<T> recuperarListados (....);

El metodo recuperarListados, además de las operaciones oportunas para recuperar los campos del listado que se trate, tendrá una llamada a un metodo mapear, que sera distinto para cada listado : mapearListadoA, mapearListadoB, mapearListadoC.

Tengo dudas en cómo usar los génericos para devolver el dato de retorno en recuperarListados,si hacer algo asi List<T> o crear una clase generica MiListado que dentro tenga un atributo List<T>.
Estuve pensando en Herencia e interfaces pero no lo veo adecuado, que piensan vosotros? Cual es la forma más agil de hacerlo?

Finalmente me gustaria hacer algo asi:

List <ListadoA> miLista1 = recuperarListados(....);
List <ListadoB> miLista2 = recuperarListados(....);

Podrían darme ideas para plantear el problema?
Apenas he usado génericos por lo que me pierdo un poco a la hora de hacer el mejor planteamiento.

Muchas gracias por adelantado.
  #2 (permalink)  
Antiguo 02/11/2013, 11:21
 
Fecha de Ingreso: mayo-2013
Ubicación: Córdoba
Mensajes: 139
Antigüedad: 11 años
Puntos: 9
Respuesta: Planteamiento con Generics Java

Yo haría algo como esto:

Código Java:
Ver original
  1. public List<T> recuperarListados(........, Class clase){
  2.  List<T> listaDeObjetos = new ArrayList();
  3.  
  4.   //Aca un blucle
  5.  T objeto = (T) Class.forName(clase.getName()).newInstance(); //crea un objeto correspondiente a su clase
  6.  Method[] metodos = objeto.getClass().getDeclaredMethods();//instancia todos los metodos de la clase
  7.  for (int i = 0; i < metodos.length; i++) {
  8.                     if (metodos[i].getName().startsWith("set")) {//si el metodo es un set->
  9.                         metodos[i].invoke(objeto, elObjetoAAgregar );                      
  10.                         //se invoca el metodo set, pasandole como atributo el valor del elObjetoAAgregar.
  11.                     }
  12.                 }
  13.                 listaDeObjetos.add(objeto);
  14.  //Fin del bucle
  15.  
  16. return listaDeObjetos;
  17. }

para llamar al metodo va a ser algo como:

Código Java:
Ver original
  1. List<ClaseA> list = recuperarListados(............, ClaseA.class);
  2. List<ClaseB> list2 = recuperarListados(............, ClaseB.class);

En los puntos se supone que se pasa algo que tiene los objetos que quieres agregar en una lista, como una JTable.
  #3 (permalink)  
Antiguo 03/11/2013, 10:48
 
Fecha de Ingreso: julio-2008
Mensajes: 7
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Planteamiento con Generics Java

Muchas gracias cazador!!
  #4 (permalink)  
Antiguo 03/11/2013, 11:05
 
Fecha de Ingreso: julio-2008
Mensajes: 7
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Planteamiento con Generics Java

Se me resuelven algunas dudas, aunque la parte de los set pues no la puedo utilizar porque depende del valor del campo y del campo que sea entro en un set u otro.

En resumen he hecho algo asi:

private List<T> recuperarListados (........., Class clase){

//creo un objeto objetoListado correspondiente a su clase
T objetoListado = (T) Class.forName(clase.getName()).newInstance();

//instancio segun el tipo de operacion

List <objetoListado> listado = new ArrayList<objetoListado>();
HashMap<Integer, objetoListado> mapaObjetosListados = new HashMap<Integer, objetoListado>;

//ahora hay dos for para sacar los campos multiples de cada columna
//y su valor, y luego llamo al metodo que mapea los campos
for(...){
if (clase instanceof ObjetoA){
mapearCamposDeA(mapaObjetosListados, campo, valor);
}else if( clase instanceof ObjetoB){
mapearCamposDeB(mapaObjetosListados, campo, valor);
}//etc.
}//termina el for

listado.addAll(mapaOperaciones.values());

return listado;
}

A la hora de llamarlo pues tal como dijiste:

List <ObjetoA> miListado = recuperarListados(...., ObjetoA);


Y como apenas he usado génericos, me gustaría saber porqué la T que te puse en rojo en List <T> cuando lo programo en eclipse me dice que no conoce el tipo T y lo señala en rojo (y lo entiendo), y me pone algo de esta forma <T> List <T> , que segun tengo entendido es para hacer métodos con parámetros genéricos, pero no es lo que quiero, tan solo que me devuelva un listado genérico List <T>, ¿qué haceis cuando ocurre esto?

Muchas gracias.
  #5 (permalink)  
Antiguo 03/11/2013, 11:11
 
Fecha de Ingreso: julio-2008
Mensajes: 7
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Planteamiento con Generics Java

Perdona que salga así el código, dime cómo lo haces para ponerlo separado en código java?
  #6 (permalink)  
Antiguo 03/11/2013, 12:07
 
Fecha de Ingreso: mayo-2013
Ubicación: Córdoba
Mensajes: 139
Antigüedad: 11 años
Puntos: 9
Respuesta: Planteamiento con Generics Java

En NetBeans no me marca lo de la T en rojo, nose a que se deba eso.

En cuanto al tema de los set, si tienes una clase Persona con dos atributos uno nombre(String) y otro documento(int).
En el método recuperarListados(estructura,Persona.class):

Código Java:
Ver original
  1. for (int i = 0; i < metodos.length; i++) {
  2.                     if (metodos[i].getName().startsWith("set")) {
  3. //si el metodo es setNombre el "elObjetoAAgregar" tendra que ser un String
  4. //y si es setDocumento tendra que ser un int
  5. //sino error.
  6.                         metodos[i].invoke(objeto, elObjetoAAgregar );    
  7.                     }
  8.                 }

Osea en tu "estructura" vas a tener definido una serie de columnas que serán de un objeto en particular (double,int,float,String,date,etc), y por cada fila una representación de un objeto (Auto,Persona,Casa,etc) el contenido de una celda es lo que tienes que "pasar por cada set".


En el menú de fuentes, a la derecha tienes un combo haciendo click en el puedes agregar código.

Etiquetas: clase, metodo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:19.