Uso de Java Generics (I)

Uno de los temas que mas quebraderos de cabeza da a los desarrolladores es la construcción Java Generics o simplemente clases Genéricas.Vamos a escribir algunos artículos hablando de este tema .Para empezar con ello vamos a construir  la clase Bolsa que es una clase sencilla que nos permitirá almacenar objetos de varios tipos.

bolsa

 

 

 

 

 

 

 

 

 

 

Esta clase tendrá un límite de objetos a almacenar . Alcanzado el limite no se podrán añadir mas .Vamos a ver su código fuente:


package com.arquitecturajava;

import java.util.ArrayList;
import java.util.Iterator;

public class Bolsa implements Iterable{

private ArrayList lista= new ArrayList();
private int tope;

public Bolsa(int tope) {
super();
this.tope = tope;
}
public void add(Object objeto ) {
if (lista.size()<=tope) {

lista.add(objeto);
}else {

throw new RuntimeException("no caben mas");
}

}

public Iterator iterator() {
return lista.iterator();
}

}

En nuestro caso vamos a disponer de dos clases con las cuales rellenar la bolsa . La clase Golosina y la clase Chocolatina.

chocolatina-golosina

Vamos a ver su código fuente :


package com.arquitecturajava;

public class Chocolatina {

private String marca;

public String getMarca() {
return marca;
}

public void setMarca(String marca) {
this.marca = marca;
}

public Chocolatina(String marca) {
super();
this.marca = marca;
}

}


package com.arquitecturajava;

public class Golosina {

private String nombre;

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public Golosina(String nombre) {
super();
this.nombre = nombre;
}

}

&nbsp;

&nbsp;

Es momento de  crear un sencillo programa que llene la Bolsa de Chocolatinas y Golosinas para luego recorrer los elementos que están en la bolsa y sacarlos por pantalla.


package com.arquitecturajava;

public class Principal {

 public static void main(String[] args) {

 Bolsa bolsa= new Bolsa(5);
 Chocolatina c= new Chocolatina("milka");
 Chocolatina c1= new Chocolatina("milka");
 Chocolatina c2= new Chocolatina("ferrero");
 Golosina g1= new Golosina("gominola");
 Golosina g2= new Golosina("chicle");

 bolsa.add(c);
 bolsa.add(c1);
 bolsa.add(c2);
 bolsa.add(g1);
 bolsa.add(g2);

 for (Object o :bolsa) {

 if( o instanceof Chocolatina) {

 Chocolatina chocolatina= (Chocolatina)o;
 System.out.println(chocolatina.getMarca());

 }else {

 Golosina golosina= (Golosina)o;
 System.out.println(golosina.getNombre());
 }
 }

 }

}

El programa funcionará correctamente, pero nos podremos dar cuenta que resulta bastante poco amigable la estructura if /else en la cual se chequean cada uno de los tipos a la hora de presentarlo por pantalla.

Java Generics

Para solventar este problema podemos construir una clase Genérica .Este tipo de clase nos permitirá definir una Bolsa de un tipo concreto . Puede ser una bolsa de Golosinas o una bolsa de Chocolatinas pero NO de las dos cosas  a la vez .Esto en un principio puede parecer poco flexible pero si nos ponemos a pensar cuando programamos solemos imprimir una lista de Facturas o una lista de Compras no una lista mixta. Así pues el enfoque parece razonable. Vamos a ver el código fuente y comentarlo:


package com.arquitecturajava.genericos;

import java.util.ArrayList;
import java.util.Iterator;

public class Bolsa<T> implements Iterable<T>{

private ArrayList<T> lista= new ArrayList<T>();
private int tope;


public Bolsa(int tope) {
super();
this.tope = tope;
}
public void add(T objeto ) {
if (lista.size()<=tope) {

lista.add(objeto);
}else {

throw new RuntimeException("no caben mas");
}

}

public Iterator<T> iterator() {
return lista.iterator();
}

}

La clase es un poco peculiar ya que al no saber de entrada de que tipo va a ser la bolsa debemos declarar un tipo Genérico T a nivel de clase y que será repetido en cada uno de los métodos que lo usen.

 tipoT

De esta manera cuando construyamos un objeto de esta clase será el momento de especificar el tipo de Bolsa que deseamos .En el siguiente ejemplo hemos elegido “Chocolatina” como tipo para la Bolsa . De esta manera la bolsa solo admitirá este tipo de objetos.


package com.arquitecturajava.genericos;

import com.arquitecturajava.Chocolatina;
import com.arquitecturajava.Golosina;

public class Principal {

public static void main(String[] args) {

Bolsa<Chocolatina> bolsa= new Bolsa<Chocolatina>();
Chocolatina c= new Chocolatina("milka");
Chocolatina c1= new Chocolatina("milka");
Chocolatina c2= new Chocolatina("ferrero");

bolsa.add(c);
bolsa.add(c1);
bolsa.add(c2);

for (Chocolatina chocolatina:bolsa) {

System.out.println(chocolatina.getMarca());
}

}

}

Acabamos de construir nuestra primera clase Generica y hemos usado un bucle forEach para recorrerla de una forma sencilla.

Otros artículos relacionados:

 

About Cecilio Álvarez Caules

Cecilio Álvarez Caules Sun Certified Enterprise Architech (J2EE/JEE).

28 Responses to Uso de Java Generics (I)

  1. Mintakastar 4 junio, 2014 at 18:53 #

    Muy claro el ejemplo.

    Tambien se podria usar para explicar la herencia o interfaces.

    Haciendo las clases Chocolatina y Golosina, que implemente la misma interfaz o que extiendan de un mismo padre.

    Asi se puediera tener una Lista (bolsa) generica, del padre o de la interfaz, y recorrer los elementos independientemente del tipo que sea…. claro tendrian que tener metodos comunes, en lugar de Marca/Nombre, podria ser Descripcion, para ambas =D

    • Cecilio Álvarez Caules 5 junio, 2014 at 9:49 #

      gracias

  2. Juan Manuel 18 junio, 2014 at 1:30 #

    Gracias !!! muy buena la explicación como siempre, podrías hacer algo sobre Hilos? Se te agradecería mucho (el problema es que no se cuantos hilos se deben aplicar a ciertos procesos, ¿existe una medida o algo para saber cuantos usar?) saludos y gracias por este sitio que dia con dia me gusta mucho mas

    • Cecilio Álvarez Caules 18 junio, 2014 at 8:00 #

      Gracias 🙂 . Me apunto la idea

  3. Raul Opazo 25 marzo, 2015 at 8:38 #

    Muchas gracias, al fin una explicación que me deja conforme.

    • Cecilio Álvarez Caules 26 marzo, 2015 at 17:29 #

      gracias 🙂

  4. Javier 2 septiembre, 2015 at 11:46 #

    Muchas gracias por la entrada, está muy bien explicado.

    Saludos!!

    • Cecilio Álvarez Caules 2 septiembre, 2015 at 14:30 #

      de nada 🙂

  5. Sin Nombre 5 septiembre, 2015 at 13:42 #

    – No sé si estoy en lo correcto pero te falta ponerle dentro del Constructor Bolsa cuanta reserva de memoria vas a dejar para introducir objetos dentro de la clase Bolsa

    – A mi opinión sería :

    new Bolsa(3);

    –> 3 porque son los objetos que vas a introducir dentro de bolsa

    public class Principal {

    public static void main(String[] args) {

    Bolsa bolsa= new Bolsa();
    Chocolatina c= new Chocolatina(“milka”);
    Chocolatina c1= new Chocolatina(“milka”);
    Chocolatina c2= new Chocolatina(“ferrero”);

    – Aun así el tutorial esta perfectamente explicado.

    • Cecilio Álvarez Caules 5 septiembre, 2015 at 18:08 #

      Si yo creo que es una opción mas flexible 🙂

  6. Hendrick 16 octubre, 2015 at 16:01 #

    Excelente explicación del uso de generics, gracias por la aclaración

    • Cecilio Álvarez Caules 17 octubre, 2015 at 19:01 #

      de nada 😉

  7. Michel 1 abril, 2016 at 21:13 #

    Hola,

    Una consulta.

    No se reproduce con la generics class el mismo ejemplo de bolsa. Tu bolsa generica no tiene cholatinas y golosinas, solo tiene chocolatinas.

    Cómo sería con una bolsa con objetos de los dos tipos?

    Entiendo que la bolsa queda del tipo que le pases, pero no queda una bolsa a la que le pones cualquier cosa.

    Me explico?

    Saludos!

    • Cecilio Álvarez Caules 2 abril, 2016 at 9:47 #

      Pues tendrías que cambiar la estructura de una forma importante , ya que una lista en principio siempre es de un tipo , tendrías que crearte por ejemplo un genérico algo como class MiGenerico que almacenara dos tipos y luego esto envolverlo en una lista generica

Trackbacks/Pingbacks

  1. Java Generics (II) uso de WildCard | Arquitectura JavaArquitectura Java - 4 julio, 2014

    […] Otros artículos : Java Generics […]

  2. Java Constructores this() y super() - Arquitectura Java - 5 noviembre, 2014

    […] artículos relacionados: Java Generic, Java ForEach vs Iterator , Expresiones […]

  3. Java Collections List vs Set (I) - Arquitectura Java - 17 febrero, 2015

    […] artículos relacionados : Java Generics , Java Generic y WildCards , Java […]

  4. Colecciones y Google Guava - Arquitectura Java - 27 febrero, 2015

    […] Otros artículos relacionados : forEach vs Iterator, Java Lambda Expressions ,Uso de Generics […]

  5. Utilizando Java Custom Generics - Arquitectura Java - 28 abril, 2015

    […] artículos relacionados: Java Generics , Java Generics WildCards, Java Set y […]

  6. Java Collections Performance - Arquitectura Java - 20 mayo, 2015

    […] artículos relacionados: List vs Set , Java Generics  ,  Java Fluid […]

  7. Java 8 Lambda Expressions (I) - Arquitectura Java - 28 junio, 2015

    […] Java Generics  […]

  8. Java Generics Erasure y sus problemas - Arquitectura Java - 26 agosto, 2015

    […] artículos relacionados: Introducción Java Generics , Java Generics WildCard,  Java Generics […]

  9. Programación Funcional, Java 8 Streams - Arquitectura Java - 9 septiembre, 2015

    […] Otros Artículos relacionados: Java Lambda ForEach, Introducción a Java Lambda , Java Generics […]

  10. El concepto de Java Collections Views - Arquitectura Java - 23 octubre, 2015

    […] artículos relacionados: Java Generics , Colecciones y Google Guava , Java Collections List vs […]

  11. Java Generic Methods - Arquitectura Java - 2 febrero, 2016

    […] artículos relacionados: Java Generics , Java Generics […]

  12. Java varargs y colecciones - Arquitectura Java - 3 junio, 2016

    […] Otros artículos relacionados:  Java Collections Views  , Java List vs Set  , Java Generics […]

  13. Java Package Visibility - Arquitectura Java - 30 junio, 2016

    […] Otros artículos relacionados: Java this vs this() , Java Generics […]

  14. Gestión de ficheros con Java nio Path - Arquitectura Java - 8 enero, 2017

    […] Otros artículos relacionados: Entendiendo los constructores en Java ,El concepto de  Java Interface ,Java Generics […]

Deja un comentario