1 Tema 17: java.util Antonio J. Sierra
2 Índice 1. Introducción. 2. Tipos Genéricos.3. Contendores: Colecciones y Mapas.
3 Introducción Los tipos genéricos añaden estabilidad al código proporcionando detección de fallos en compilación. Se introduce en la Java SE 5.0. Permite a un método operar con objetos de varios tipos mientras se proporciona seguridad en los tipos en tiempo de compilación. Los tipos genéricos se usa en Java Collections Framework para evitar el uso cast.
4 Tipos genéricos
5 Ejemplo public class Box { //Otro ejemplo ... private Object object;public void add(Object object) { this.object = object; } public Object get() { return object; //Otro ejemplo ... public class BoxDemo2 { public static void main(String[] args) { // SOLO objetos Integer en Box! Box integerBox = new Box(); // Si es parte de una aplicación // modificada por un programador. integerBox.add("10"); // es un String // ... Y este es otro, escrito quizas // por otro programador. Integer unInteger = (Integer)integerBox.get(); System.out.println(unInteger); } /* Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer at BoxDemo2.main(BoxDemo2.java:6) If the Box class had been designed with generics in mind, this mistake would have been caught by the compiler, instead of crashing the application at runtime. */ public class BoxDemo1 { public static void main(String[] args){ // SOLO objetos Integer en Box! Box integerBox = new Box(); integerBox.add(new Integer(10)); Integer unInteger = (Integer)unBox.get(); System.out.println(unInteger); }
6 Ejemplo Para crear un tipo genérico se debe cambiar “class Box” por “class Box
7 Referencias e instanciaciónPara referenciar esta clase genérica desde el propio código, se reemplaza T con algún valor concreto, como Integer: Box
8 Convenios de nombrado Los tipos genéricos pueden tener múltiples parámetros, y deberían ser únicos en la declaración de la clase o interfaz. Una declaración de Box
9 Aplicación a métodos /** * This version introduces a generic method. */ public class Box
10 Límites a los parámetros de tipo/** * This version introduces a bounded type parameter. */ public class Box
11 Bucles for Considerando el problema de escribir una rutina que imprima todos los elementos de una colección. Con las versiones antiguas del lenguaje (anteriores a la 5.0) se puede realizar de la siguiente forma: void printCollection(Collection c) { Iterator i = c.iterator(); for (k = 0; k < c.size(); k++) { System.out.println(i.next()); } Un mejor intento de escribirlo es usando un tipo genérico y una nueva sintaxis: void printCollection(Collection for (Object e : c) { System.out.println(e); } El viejo código podría ser llamado con cualquier clase de colección como un parámetro, el nuevo código solo vale para Collection
12 Wildcard type El supertipo de todas las clases de objetos se escribe con >. Se puede escribir void printCollection(Collection> c) { for (Object e : c) { System.out.println(e); } Esto es una colección que puede ser válida con cualquier tipos de elementos (desconocidos).
13 Wildcard Para especificar una jaula capaz de contener algún animal:Jaula extends Animal> unaJaula = ...; Es posible especificar un umbral inferior usando la palabra super en lugar de extends. El código super Animal>, además, debería se leído como “un tipo desconocido que es un supertipo de Animal, posiblemente el mismo Animal. Se puede especificar un tipo desconocido con sin límite, que es simplemente >. Un comodín es esencialmente igual que extends Object>.
14 Colecciones
15 Introducción Una colección es un objeto que agrupa múltiples elementos en una sola unidad. Las colecciones se usan para almacenar, recuperar, manipular y comunicar agregación de datos. Normalmente representan ítem de datos que forma un grupo natural, tal y como una baraja de cartas, carpeta de correos o directorio telefónico. Las primeras implementaciones del lenguaje de programación Java (antes de la versión 1.2) incluyeron Vector, Hashtable, y array. Pertenen al paquete: java.util.
16 Clasificación de las InterfacesCollection Map Set List Queue SortedMap SortedSet
17 La interfaz Collection
18 Métodos de Collection
19 Set, List y Queue Set
20 Implementaciones de CollectionImplementaciones de Set
21 Mapas: Map
22 Método equals SortedMap: es un Mapa que mantiene un orden ascendente en las claves. Es análogo a SortedSet. Los Mapas ordenados se usan de una forma natural en colecciones ordenadas de pares claves-valor, tales como diccionarios y directorios de teléfono. Muchos métodos en las interfaces Collections Framework están definidas en términos del método equals. Por ejemplo, la especifiación del método containsKey(Object key) dice: "returns true if and only if this map contains a mapping for a key k such that (key==null ? k==null : key.equals(k))." Esta especificación no debería ser construida para invocar Map.containsKey con una clave no nula provocará que invoque a key.equals(k) con la clave k. Las implementaciones pueden evitar las invocaciones a equals, por ejemplo, comparando el código hash de las dos claves. (La especificación de Object.hashCode() garantiza que dos objetos con distinto código hash no puedan ser iguales).
23 Métodos de Map
24 Implementaciones de Map
25 Recorriendo las coleccionesHay dos tipos de colecciones para recorrer: Con la construcción for-each. Usando iteradores.
26 Código para el recorridoConstrucción for-each: Permite de forma concisa atravesar una colección o array usando un bucle for. El siguiente código usa la construcción for-each para imprimir cada elemento de una colección en una línea separada. for (Object o : collection) System.out.println(o); Iteradores: Un iterador es un objeto que permite atravesar una colección y borrar elementos de la colección de la colección de forma selectiva. Se puede obtener un Iterator de una colección invocando al método iterator. public interface Iterator
27 Comparación de for-each e IteratorSe debe usar un Iterator en lugar de for-each cuando se necesite: Borrar el actual elemento. Los bloques for-each ocultan el iterador, y por tanto no se pueden eliminar. Iteración sobre múltiples colecciones en paralelo. El siguiente método muestra como usar un iterador para filtrar una colección arbitraria, es decir que atraviesa la colección borrando elementos específicos: static void filter(Collection> c) { for (Iterator> it = c.iterator(); it.hasNext(); ) if (!cond(it.next())) it.remove(); } Este trozo de código es polimórfico, que significa que funciona con cualquier colección sin importar su implementación.
28 Referencias Colecciones Tipos genéricos Tipos genéricos