Uso de Clases Genéricas en Java
El tema de las clases genéricas es bastante amplio, y algunas de ellas están lo suficientemente avanzadas. Sin embargo, un conocimiento básico de los genéricos es necesario para todos los programadores de Java. Aunque la sintaxis de los genéricos puede parecer un poco intimidante las clases genéricas son sorprendentemente fáciles de usar.
Las clases genéricas nos evitan duplicar clases que administran tipos de datos distintos, pero implementan algoritmos o una lógica similar. En pocas palabras evitan la redundancia de código.
Por lo que, una ventaja principal del código genérico es que trabajará automáticamente con el tipo de dato pasado como parámetro de tipo.
Para mostrar cómo funciona una clase genérica vamos a construir una clase llamada Bolsa que nos permitirá almacenar objetos de varios tipos.
El principio de una clase genérica es que esta clase en este caso una bolsa, puede ser un objeto donde almacenar Sodas o Chocolates, pero no de las dos a la vez*.
import java.util.ArrayList;
public class Bolsa < T > {
private ArrayList < T > lista = new ArrayList < T >();
public void add(T objeto){
lista.add(objeto);
}
public ArrayList<T> getProducts(){
return lista;
}
}
El parámetro de tipo T será el que la bolsa manipulará. Este parámetro se utiliza en la declaración de la clase Bolsa para representar el tipo del elemento.
Entonces para utilizar esta clase genérica, al momento de instanciar se deberá de mandar como argumento el tipo de dato que vamos a querer almacenar en nuestra bolsa.
public static void main(String[] args) {
Bolsa<Soda> bolsaDeSodas = new Bolsa<Soda>();
Bolsa<Chocolate> bolsaDeChocolates = new Bolsa<Chocolate>();
bolsaDeSodas.add(new Soda(“Soda_1”, “Limon”));
bolsaDeSodas.add(new Soda(“Soda_2”, “Fresa”));
bolsaDeChocolates.add(new Chocolate(“Chocolate_1”, “Negro”));
bolsaDeChocolates.add(new Chocolate(“Chocolate_2”, “Blanco”));
}
Lo que se hizo fue que dinámicamente la Bolsa cambio el tipo de dato que se está manipulando por lo que internamente la Bolsa<Soda> se vería así:
import java.util.ArrayList;
public class Bolsa {
private ArrayList < Soda > lista = new ArrayList < Soda >();
public void add(Soda objeto){
lista.add(objeto);
}
public ArrayList<Soda> getProducts(){
return lista;
}
}
En conclusión, una clase genérica se va a adaptar al tipo de dato que sea mandado como argumento y evitamos tener una clase por cada tipo de dato. Por ejemplo, de tener las clases BolsaChocolate y BolsaSoda, mejor, tenemos una genérica Bolsa.
De las clases genéricas más utilizadas de java se encuentran las collecciones como ArrayList, HashSet, HashMap, LinkedList.
*Si no indicamos un tipo de dato para la clase genérica, tomara Object como parámetro y entonces nuestra Bolsa podrá almacenar cualquier tipo de objeto.
Bolsa bolsa = new Bolsa();