A3F

Anuncio
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
Descargar