Interfaces Colecciones e iteradores...

37
A3F Interfaces Colecciones e iteradores Genericidad Carlos Fontela [email protected]

Transcript of Interfaces Colecciones e iteradores...

A3F

Interfaces

Colecciones e iteradores

Genericidad

Carlos Fontela

[email protected]

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 15

Colecciones de java.util (1)

Las más comunes de Java 1.4:

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 22

Ejercicio: lista circular (2)

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 24

Ejercicio lista circular: otra visión

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”

A3F2c2009 37

Qué sigue

Clase especial

Primer parcial

Desarrollo de software y metodología