Interfaces Colecciones e iteradores Genericidad Carlos Fontela [email protected] A3F Temario Interfaces y herencia sin implementación Colecciones e iteradores En Java 1.4 y .NET 1.1 Genericidad Desde Java 5 y .NET 2 2c2009 2 A3F Interfaces: clases “muy abstractas” Son como clases Abstractas Todos los métodos abstractos Sin atributos (sin estado) Ejemplo public interface Imprimible { public abstract void imprimirDatos(); // público y abstracto por defecto } Podrían heredar de otras interfaces Uso public class CajaAhorro extends CuentaBancaria implements Imprimible {...} Corolario 2c2009 Si una clase declara implementar una interfaz y no define uno de sus métodos es abstracta 3 A3F Interfaces: protocolos Son grupos de métodos sin implementar Una clase puede implementar varias Ojo con los conflictos de nombres 2c2009 4 A3F Interfaces y polimorfismo (1) Variables cuyo tipo es una interfaz Imprimible i = new Fecha(20,6,1964); Imprimible[ ] lista = new Imprimible[3]; lista[0] = new Fecha (20, 1, 2000); lista[1] = new Inmueble ( ); lista[2] = new Fecha (8, 6, 2002); … for (int i=0; i < 3; i++) lista[i].imprimirDatos(); Ojo que sólo puedo instanciar clases 2c2009 5 A3F Interfaces y polimorfismo (2) Cada objeto puede tener muchas “caras” Fecha f = new Fecha(20,6,1964); Imprimible i = f; Comparable c = f; Serializable s = f; Todos se refieren al mismo objeto Pero “lo ven” distinto Cada variable sólo puede usar los métodos de su interfaz 2c2009 6 A3F ¿Qué es una interfaz? Visión de lenguaje Una clase “muy abstracta” que se puede usar para herencia múltiple Visión desde el uso Un tipo de datos que permite que ver a un mismo objeto con distintos tipos => Cada tipo implica un comportamiento 2c2009 7 A3F Interfaces predefinidas Caso de Comparable En java.lang.Comparable interface Comparable { int compareTo (Object o); } Devuelve valores <0, 0 o >0 ¡Muy útil en colecciones! Hay otras predefinidas Comparator, Serializable, Cloneable, etc. 2c2009 8 A3F Uso de Comparable public class Fraccion implements Comparable { private int numerador; private int denominador; // otros métodos public int compareTo(Object otro) { Fraccion otra = (Fraccion) otro; if (numerador * otra.denominador > denominador * otra.numerador) return 1; else if (numerador * otra.denominador < denominador * otra.numerador) return -1; else return 0; } } 2c2009 9 A3F Comparable y arreglos Clase Arrays: uso Fraccion [ ] v = new Fraccion[4]; Arrays.sort (v); int posicion = Arrays.binarySearch (v, x); Método sort(): definición public void sort (Comparable [ ] w) { … } Si Fraccion implementa Comparable, puedo usar Arrays.sort(v) ¿Y si no? 2c2009 10 A3F Rarezas: Comparator Si la clase de v no implementa Comparable, existe otro sort(): public void sort (Object [ ] v, Comparator c) { … } Que puedo usar así: Comparator comp = new ComparadorFracciones(); Arrays.sort (x, comp); ¿Y qué es ComparadorFracciones? Una clase que implementa java.util.Comparator… Y su método: public int compare (Object o1, Object o2); 2c2009 11 A3F Implementación del comparador public class ComparadorFracciones implements java.util.Comparator { public int compare (Object o1, Object o2) { Fraccion f1 = (Fraccion)o1; Fraccion f2 = (Fraccion)o2; if ( f1.getNumerador() * f2.getDenominador() > f1.getDdenominador() * f2.getNumerador() ) return 1; else if ( f1.getNumerador() * f2.getDenominador() < f1.getDenominador() * f2.getNumerador() ) return -1; else return 0; } 2c2009 } 12 A3F ¿Qué hicimos? Creamos una clase ¡que no tiene estado! ¡Y la instanciamos! Tampoco se refiere a una entidad de dominio Aparece por necesidades de diseño (solución) Sólo sirve por el método que lleva dentro Esto es un patrón de diseño: Command Otro uso de Comparator: Para definir otra forma de ordenamiento 2c2009 13 A3F Colecciones Agrupan objetos Se puede operar sobre: Un elemento en particular Algunos elementos elegidos mediante un filtro La colección como conjunto Se definen recorridos Tienen diferentes interfaces, funcionalidades y eficiencias Arreglos, listas, árboles, etc. 2c2009 14 A3F Colecciones de java.util (1) Las más comunes de Java 1.4: 2c2009 15 A3F Colecciones de java.util (2) Tienen elementos de tipo Object. No se sabe qué hay dentro “Casteo” para obtener utilidad No admiten elementos primitivos. Pero hay clases envolventes: Integer, Boolean, Double, Character, etc. Colecciones heredadas: Vector, Hashtable, Stack, BitSet, Properties, etc. 2c2009 16 A3F Clase Collections Una clase utilitaria de métodos estáticos Algunos métodos: void sort (Collection c, Comparator comp) int binarySearch (Collection c, Object x, Comparator comp) Object max (Collection c, Comparator comp) Object min (Collection c, Comparator comp) void reverse() Collection unmodifiableCollection (Collection c) 2c2009 17 A3F Iteradores: definición y uso Objetos que saben cómo recorrer una colección, sin ser parte de ella Interfaz: Tomar el primer elemento Tomar el elemento siguiente. Chequear si se termina la colección Un ejemplo: List vector = new ArrayList(); for(int j = 0; j < 10; j++) vector.add(j); Iterator i = vector.iterator(); while ( i.hasNext() ) // pido un iterador para vector // recorro la colección System.out.println( i.next() ); 2c2009 18 A3F Iteradores y colecciones Toda clase que implemente Collection puede generar un Iterator con el método iterator «interface» Iterator +next() : Object +hasNext() : boolean «uses» «interface» Collection +iterator() : Iterator Nótese que Iterator es una interfaz Pero está implementada para las colecciones definidas en java.util. 2c2009 19 A3F Iteradores: para qué Llevan la abstracción a los recorridos de colecciones Facilitan cambios de implementación Collection lista = new ArrayList ( ); Iterator i = lista.iterator(); lista while ( i.hasNext() ) // pido un iterador para // recorro la colección System.out.println( i.next() ); No se necesita trabajar con el número de elementos Convierten a las colecciones en simples secuencias 2c2009 20 A3F Ejercicio: lista circular (1) ¿Qué es una lista circular? Definición: una lista que se recorre indefinidamente, de modo tal que al último elemento le sigue el primero Es un caso particular de LinkedList ¿Qué cambia? ¿Nada? ¿Sólo la forma de recorrerla? => El iterador es diferente 2c2009 21 A3F Ejercicio: lista circular (2) 2c2009 22 A3F Ejercicio: lista circular (3) public class ListaCircular extends LinkedList { public Iterator iterator( ) { return new IteradorListaCircular(this); } } Implementar la clase IteradorListaCircular Con sus métodos next() y hasNext() 2c2009 23 A3F Ejercicio lista circular: otra visión 2c2009 24 A3F Genericidad (1) Los tipos pueden ser parámetros de clases y métodos Ejemplo Java sin genericidad: List v = new ArrayList( ); String s1 = “Una cadena”; v.add(s1); String s2 = (String)v.get(0); Ejemplo Java con genericidad: List<String> v = new ArrayList<String>( ); String s1 = “Una cadena”; v.add(s1); // el compilador verifica que s1 sea un String String s2 = v.get(0); 2c2009 25 A3F Genericidad (2) En métodos, el compilador infiere el tipo genérico: public static <T> void eliminarElemento (List<T> lista, int i) { … } eliminarElemento (listaConcreta, 6); Mejoras: Robustez en tiempo de compilación Legibilidad Cuestiones avanzadas public static <T extends Comparable > void ordenar (T[ ] v) { … } public static <T > copy (List<T> destino, List<? extends T> origen) { … } 2c2009 public static <T, S extends T> copy (List<T> destino, List<S> origen) { …} 26 A3F Genericidad: Java vs. .NET Java usa la genericidad sólo para tiempo de compilación No llega al bytecode => compatibilidad hacia atrás No hay información del tipo completa en tiempo de ejecución .NET mantiene la información de tipos completa hasta tiempo de ejecución Pero generó una biblioteca de clases nueva => sin compatibilidad hacia atrás 2c2009 27 A3F Estados, eventos, transiciones Estado representado por el conjunto de valores adoptados por los atributos de un objeto en un momento dado situación de un objeto durante la cual satisface una condición, realiza una actividad o espera un evento Evento Estímulo que puede disparar una transición de estados Especificación de un acontecimiento significativo Señal recibida, cambio de estado o paso de tiempo Síncrono o asíncrono 2c2009 28 A3F Diagrama de estados UML: ajedrez / Juegan las blancas Turno de las blancas Turno de las negras / Juegan las negras / Jaque mate / Tablas / Tablas Ganan las negras Ganan las blancas 2c2009 / Jaque mate 29 A3F Diagrama de estados UML: estados civiles (1) Menor impúber Soltero Viudo Casado No nacido Unión de hecho Estado: Vivo Divorciado Fallecido 2c2009 30 A3F Diagrama de estados UML: estados civiles (2) Menor impúber Soltero Estado: Post-casado Casado Viudo No nacido Divorciado Unión de hecho Estado: Vivo Fallecido 2c2009 31 A3F UML Lenguaje de modelado Modelos representan la realidad Si un programa es un modelo => un modelo de un programa es un modelo de un modelo 2c2009 32 A3F Claves Interfaces definen qué puede hacer un objeto Colecciones e iteradores los vimos a modo de repaso de conceptos Y de uso de principios de diseño que formalizaremos más adelante Genericidad != POO 2c2009 33 A3F Lectura obligatoria "A Comparative Analysis of Generic Programming Paradigms in C++, Java and C#", Arijit Khan and Shatrugna Sadhu, http://www.cs.ucsb.edu/~arijitkhan/cs263.pdf "Generics in C#, Java, and C++ - a conversation with Anders Hejlsberg, by Bill Venners with Bruce Eckel", http://www.artima.com/intv/genericsP.html "Generics Considered Harmful", de Ken Arnold, http://weblogs.java.net/blog/arnold/archive/20 05/06/generics_consid_1.html 2c2009 34 A3F Lecturas opcionales Orientación a objetos, diseño y programación, Carlos Fontela 2008, capítulos 7 y 8 “Polimorfismo basado en herencia” y “Polimorfismo basado en interfaces” UML Distilled 3rd Edition, Martin Fowler, capítulo 1 “Introduction” Hay edición castellana de la segunda edición Debería estar en biblioteca (?) UML para programadores Java, Robert Martin, capítulo 2 “Trabajar con diagramas” No está en la Web ni en la biblioteca Orientación a objetos, diseño y programación, Carlos Fontela 2008, capítulos 10 u 11 “Colecciones basadas en polimorfismo” y “Genericidad” 2c2009 35 A3F Lecturas optativas UML Distilled 3rd Edition, Martin Fowler, capítulo 1 “Introduction” Hay edición castellana de la segunda edición Debería estar en biblioteca (?) UML para programadores Java, Robert Martin, capítulo 2 “Trabajar con diagramas” No está en la Web ni en la biblioteca Orientación a objetos, diseño y programación, Carlos Fontela 2008, capítulos 9 y 10 “Excepciones” y “Colecciones basadas en polimorfismo” 2c2009 36 A3F Qué sigue Clase especial Primer parcial Desarrollo de software y metodología 2c2009 37 A3F