Generics

Objetivos de la Presentación.

  • Aprender el uso de generics en JAVA.
  • Desarrollar programas mas estables.
  • Garantización de un conjunto homogéneo de elementos en JAVA.
  • Identificación de la diferencia entre una platilla en c y un generic en java .
  • Conocer las nuevas implementaciones de JAVA.

Introducción.

Java Specification Request (JSR) 14 propone introducir tipos y métodos genéricos en el lenguaje de programación JAVA. Desde los comienzos de JAVA, los desarrolladores han intentado agregarle los tipos genéricos al lenguaje. Los tipos genéricos han sido usados por años en otros lenguajes de programación y ahora serán parte de Java 1.5.

Generics

  • Es una de las bases de la Programación Orientada a Objetos que surge por la necesidad de abstraer el tipo de contenido a un contenedor, los cuales también se le conocen como “tipos parametrizados”.
  • Se utilizan especialmente para implementar tipos abstractos de datos: pilas, colas, anillos, bolsas y otros que permiten almacenar distintos tipos de elementos según sean instanciados en tiempo de compilación.
  • Cuando tomas un elemento fuera de su colección es necesario hacer un cast para el tipo de elemento que es almacenado, esto trae un inconveniente, es inseguro.
  • Cuando tomas un elemento fuera de su colección es necesario hacer un cast para el tipo de elemento que es almacenado, esto trae un inconveniente, es inseguro.
  • El compilador no checa si tu cast es correcto, entonces el cast puede fallar en tiempo de ejecución.
  • Generics te proporciona el modo de que le podamos comunicar al compilador que tipo de datos se van a utilizar. Una vez que el compilador sabe que tipo de dato se va a utilizar puede checar que has utilizado tipos de datos correctos.

Implementación de generics

Miremos el siguiente programa:

List v = new ArrayList();
v.add(”test”);
String a = (String) v.get(0);
Integer b = (Integer) v.get(0);

Hay algunos problemas con este fragmento de código:
1. Conceptualmente, queremos expresear una lista de algo, como una lista de Strings por ejemplo. Sin embargo el lenguaje no soporta esta expresión. La lista sólo puede ser vista como una lista de Objects.
2. En consecuencia, un error en la linea 4 no es atrapado por el compilador. Este código compilará bien pero largará una excepción en tiempo de ejecución (java.lang.ClassCastException) cuando el progama sea ejecutado.
3. Sintácticamente, es un poco engorroso castear de un tipo a otro tipo, como en las lineas 3 y 4.
Podemos reescribir el código utilizando generics:

List <String> v = new ArrayList <String> ();
v.add(”test”);
String a = v.get(0);
Integer b = v.get(0);

Es bastante similar al primer fragmento, salvo por el código entre los corchetes angulares. Estos corchetes angulares son la sintaxis para proveer el tipo de los parámetros. No es necesario el casteo del resultado a un tipo String porque la referencia a “v” es de tipo List<String>, entonces sabemos que el metodo get siempre devuelve un String. Cuando lo compilemos tendremos un error de compilación en la linea 4, porque get() devuelve siempre String y no un Integer, entonces capturaremos este error en tiempo de compilación y no en tiempo de ejecución que es mas valioso

¿Qué es “CAST”?

Cast es el proceso de convertir o moldear un tipo de dato a otro.
Ejemplo:

char c = 'A';
int i = (int) c;

Otro Ejemplo
Se tiene una canasta de frutas. Para que se pueda añadir Naranjas, plátanos, uvas, etc .Ahora, vamos a crear una cesta de banano. Para esto, sólo debe ser capaz de añadir los plátanos , esto debe rechazar la adición de otros tipos de frutas.
Cuando la cesta de Banano solicita una Banana a la cesta de fruta también puede añadir una naranja. Mientras la adición de un plátano a una cesta de banano está bien, añadiendo una naranja no lo es. En el mejor, esto dar lugar a una excepción en tiempo de ejecución. Sin embargo, el código que utiliza la Canasta de Frutas puede no saber cómo manejar esto.
Banana es una fruta, es decir, hereda de Fruto.
Dibujo

Diferencia entre plantillas y generics

En C++ se utiliza la “traducción textual” para instanciar los tipos, la declaración de la plantilla se utiliza como una macro, por lo tanto se necesita el código fuente de la plantilla para su instanciación, cada vez que se utiliza una plantilla esta se recompila.
Esta aproximación es “grande y rápida” ya que cada instanciación de la plantilla consume almacenamiento primario y secundario, sin embargo son posibles optimizaciones de velocidad en tiempo de ejecución. También permite un completo soporte para la reflexión
En Java los tipos genéricos se compilan una sola vez, el código del tipo no se muestra al usuario.
La aproximación usada en la especificación de tipos genéricos en Java se utiliza la “traducción homogénea”, esta es una aproximación “pequeña y lenta” sólo se requiere un archivo “bytecode” por tipo genérico, con el ahorro de memoria y además se oculta el código fuente del tipo, pero imposibilita las optimizaciones de velocidad y se limita el soporte a la reflexión

Métodos Genéricos.

Así como las clases e interfaces pueden ser genéricas, los métodos también pueden recibir parámetros genéricos.
La invocación de métodos genéricos no tiene una sintaxis especial, se hace la llamada omitiendo la sección de parámetros y la sustitución de estos se hace de forma automática según la declaración del método.

Objetivos Del uso de Generics.

  • Reducir el numero de conversiones (cast) en el programa, así reduciremos el numero de errores en el programa.
  • Generamos un programa mucho ams seguro
  • Construcción de tipos abstractos reutilizables
  • Disminución de comprobación de tipos en tiempo de ejecución
  • Menos costoso ya que es mejor corregir errores mientras es compilado que mientras esta siendo ejecutado
  • Problemas de diseño, que anteriormente tenían que ser abordados de forma indirecta dando lugar a soluciones poco satisfactorias, puedan ser resueltos mediante soluciones de diseño simples y elegantes con el uso de la genericidad.

Programas

Ejemplos de Generics

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License