Tipos y clases genéricos en Java

Iniciado por Expermicid, Octubre 13, 2014, 02:15:42 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Buenas a todos!!!

Para entender un poco este concepto veamos un ejemplo:

"Una fábrica de juegos de PC desea modelar un sistema de selección aleatoria de Jugadores (RandomSelector). Dado que la selección aleatoria se usa en muchos y variados juegos (p.e: selección aleatoria de números, de cartas, de colores, de fichas, etc.) se detallo que el RandomSelector debería ser diseñado de tal forma que se pueda usar con cualquier tipo de objetos.
El funcionamiento debería ser el siguiente: Una vez creado el RandomSelector con el tipo de Objeto que va a seleccionar este permanece así. Al RandomSelector se le pueden agregar N objetos a seleccionar. Cuando se le dice selectNext() retorna un objeto seleccionado de manera aleatoria."

En java, cuando se define una nueva clase, se debe conocer el tipo de datos con el que se trabajará. Pero en este caso necesitamos que sea independiente al tipo de datos, y así poder reutilizar la clase sin necesidad de hacer alteraciones al código.
Es aquí donde entra el concepto de tipos genéricos.

La utilización seria:

Código: java
public class RandomSelector<T> {

}


T es un tipo genérico que será sustituido por el tipo real cuando se instancie la clase.
Al RandomSelector se le podía agregar N objetos, vamos a necesitar hacer uso de alguna colección para ir guardando los objetos.

Código: java
import java.util.ArrayList;
import java.util.Random;

public class RandomSelector<T> {

private ArrayList<T> elementos;
private Random rn;

public RandomSelector() {
this.elementos = new ArrayList<T>();
this.rn = new Random();
}

}


Verán como a la colección se le da como tipo de datos a T, el tipo genérico.
rn es de tipo Random, y nos va servir más adelante para la aleatoriedad.
Agregamos el método agregarElemento que recibe como parámetro un objeto de tipo T y lo agrega a la colección.

Código: java
public void agregarElemento(T elemento) {
this.elementos.add(elemento);
}


Por otro lado, el método selectNext retorna un elemento de tipo T, y que es el que se ubica en la posición 'x' de la colección elementos. Dichas posición 'x' se obtiene con un numero aleatorio que va desde 0 al tamaño de la colección - 1

Código: java
public T selectNext() {
return this.elementos.get(rn.nextInt(this.elementos.size()));
}


Probemos como funcionaría:

Código: java
public static void main(String[] args) {
RandomSelector<String> rS1 = new RandomSelector<String>();
rS1.agregarElemento("Piedra");
rS1.agregarElemento("Papel");
rS1.agregarElemento("Tijera");
System.out.println(rS1.selectNext());

RandomSelector<Integer> rS2 = new RandomSelector<Integer>();
rS2.agregarElemento(1);
rS2.agregarElemento(2);
rS2.agregarElemento(3);
System.out.println(rS2.selectNext());
}




Usamos un primer objeto RandomSelector con T = String y uno segundo con T = Integer. Y funcionó de igual manera sin importar el tipo

Por último existen una serie de convenciones para nombrar a los genéricos:
  • E – Element (usado bastante por Java Collections)
  • N – Number (para números)
  • K – Key (Llave, usado en mapas)
  • T – Type (Representa un tipo, es decir, una clase)
  • V – Value (representa el valor, también se usa en mapas)

Saludos

Buenísimo!! sabia el uso de tipos genéricos en C++ con las templates, pero en Java no tenia idea!.
 
Gracias por el aporte me sirvió mucho, Saludos!! :)
Ser mejor cada día es mi meta

=LKI=