Interfaces Colecciones e iteradores...
Transcript of Interfaces Colecciones e iteradores...
A3F2c2009 2
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
A3F2c2009 3
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
Si una clase declara implementar una interfaz y no define uno de sus métodos es abstracta
A3F2c2009 4
Interfaces: protocolos
Son grupos de métodos sin implementar
Una clase puede implementar varias
Ojo con los conflictos de nombres
A3F2c2009 5
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
A3F2c2009 6
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
A3F2c2009 7
¿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
A3F2c2009 8
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.
A3F2c2009 9
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;
}
}
A3F2c2009 10
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?
A3F2c2009 11
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);
A3F2c2009 12
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;
}
}
A3F2c2009 13
¿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
A3F2c2009 14
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.
A3F2c2009 16
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.
A3F2c2009 17
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)
A3F2c2009 18
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(); // pido un iterador para vector
while ( i.hasNext() ) // recorro la colección
System.out.println( i.next() );
Iteradores: definición y uso
A3F2c2009 19
Iteradores y colecciones
Toda clase que implemente Collection puede generar un Iterator con el método iterator
Nótese que Iterator es una interfaz
Pero está implementada para las colecciones definidas en java.util.
+next() : Object
+hasNext() : boolean
«interface»
Iterator
+iterator() : Iterator
«interface»
Collection
«uses»
A3F2c2009 20
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(); // pido un iterador para lista
while ( i.hasNext() ) // 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
A3F2c2009 21
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
A3F2c2009 23
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()
A3F2c2009 25
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);
A3F2c2009 26
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) { …
}
public static <T, S extends T> copy (List<T> destino, List<S> origen) {
… }
A3F2c2009 27
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
A3F2c2009 28
Estados, eventos, transicionesEstado
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
A3F2c2009 29
Diagrama de estados UML: ajedrez
Turno de las blancas Turno de las negras
/ Jaque mate
/ Juegan las blancas
/ Juegan las negras
/ Jaque mate/ Tablas/ Tablas
Ganan las blancas Ganan las negras
A3F2c2009 30
Diagrama de estados UML: estados civiles (1)
Soltero
Casado
Viudo
DivorciadoUnión de hecho
Menor impúber
Estado:
Vivo
Fallecido
No nacido
A3F2c2009 31
Diagrama de estados UML: estados civiles (2)
Soltero
Casado
Viudo
Divorciado
Unión de hecho
Menor impúber
Estado:
Vivo
Fallecido
No nacido
Estado:
Post-casado
A3F2c2009 32
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
A3F2c2009 33
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
A3F2c2009 34
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/2005/06/generics_consid_1.html
A3F2c2009 35
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”
A3F2c2009 36
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”