69
POO en lenguaj estático estático Carlos F cfontela@ No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo. jes de tipos os A3F os Fontela @fi.uba.ar

POO en lenguajes de tipos estáticos - materias.fi.uba.armaterias.fi.uba.ar/7507/content/2011-2/teoricas/7507_06_otros... · POO en lenguajes de tipos estáticos Carlos Fontela [email protected]

Embed Size (px)

Citation preview

POO en lenguajes de tipos

estáticosestáticos

Carlos Fontela

[email protected]

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

POO en lenguajes de tipos

estáticos

A3F

estáticos

Carlos Fontela

[email protected]

Agenda

Aspectos generales de implementación

Interfaces

Como mecanismo necesario para el polimorfismo sin herencia

2c2011 2

polimorfismo sin herencia

Excepciones chequedas en forma estática

Mecanismo de Java

Colecciones, iteradores y genericidad

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Agenda

Aspectos generales de implementación

Como mecanismo necesario para el polimorfismo sin herencia

A3F

polimorfismo sin herencia

Excepciones chequedas en forma estática

Colecciones, iteradores y genericidad

Aspectos generales de implementación

2c2011 3

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Aspectos generales de implementación

A3F

¿Cuál es la diferencia?

Lenguajes de tipos estáticos

Las variables tienen tipos

Hay chequeo de tipos en tiempo de compilación

ArrayList x = new ArrayList ( );

ArrayList y = new Date ( );ArrayList y = new Date ( );

Lenguajes de tipos dinámicos

Las variables no tienen tipos

No hay chequeo posible en tiempo de compilación

x := OrderedCollection new.

x := CuentaBancaria new.

2c2011 4

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

¿Cuál es la diferencia?

Lenguajes de tipos estáticos

Hay chequeo de tipos en tiempo de compilación

ArrayList x = new ArrayList ( );

ArrayList y = new Date ( );

A3F

ArrayList y = new Date ( );

Lenguajes de tipos dinámicos

Las variables no tienen tipos

No hay chequeo posible en tiempo de compilación

x := OrderedCollection new.

x := CuentaBancaria new.

Lenguajes de tipeo dinámico

Smalltalk

Python

Ruby

Objective-CObjective-C

Self

Groovy

CLOS

2c2011 5

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Lenguajes de tipeo dinámico

A3F

Lenguajes de tipos estáticos

Java

En general, lo vamos a usar en nuestros ejemplos

Toda vez que no digamos lo contrario

C#

2c2011 6

C#

Leves diferencias con Java

C++

Con compilación a código nativo

Simula, Eiffel, Object Pascal, Scala, etc.

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Lenguajes de tipos estáticos

En general, lo vamos a usar en nuestros ejemplos

Toda vez que no digamos lo contrario

A3F

Leves diferencias con Java

Con compilación a código nativo

Simula, Eiffel, Object Pascal, Scala, etc.

Variables, tipos y objetos

Date fecha1 = new Date (1983, 12, 10);

Date fecha2 = new Date (2009, 8, 1);

Date fecha3 = new Date (2002, 6, 10);

String nombre = new String ("Carlos Fontela");

ArrayList lista = new ArrayList ( );

1c2011 7

ArrayList lista = new ArrayList ( );

lista.add (fecha1); lista.add (fecha2); lista.add (fecha3);

Collections.sort(lista);

lista.add (nombre);

for (int i = 0; i < lista.size(); i++)

System.out.println(lista.get(i).toString());

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Variables, tipos y objetos

Date fecha1 = new Date (1983, 12, 10);

Date fecha2 = new Date (2009, 8, 1);

Date fecha3 = new Date (2002, 6, 10);

String nombre = new String ("Carlos Fontela");

A3F

lista.add (fecha1); lista.add (fecha2); lista.add (fecha3);

System.out.println(lista.get(i).toString());

Declaración:

ArrayList x;

Definición:

x = new ArrayList( );

Creación de objetos

1c2011 8

Significado

ArrayList es el tipo de x (que es una variable tipada)

ArrayList( ) es el “constructor” de la clase ArrayList

El objeto se crea recién cuando llamo al constructor con el operador

“new”

En x queda una referencia a un objeto de clase ArrayList

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Creación de objetos

A3F

ArrayList es el tipo de x (que es una variable tipada)

ArrayList( ) es el “constructor” de la clase ArrayList

El objeto se crea recién cuando llamo al constructor con el operador

En x queda una referencia a un objeto de clase ArrayList

En Java, los primitivos: int, char, boolean, etc.

No son objetos

En C#, los que derivan de System.ValueType

Objetos sin herencia

En C++, todos menos las referencias

Tipos por valor

1c2011 9

En C++, todos menos las referencias

Viven mientras estén en su ámbito

== compara valores

= asigna valores

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

En Java, los primitivos: int, char, boolean, etc.

En C#, los que derivan de System.ValueType

En C++, todos menos las referencias

Tipos por valor

A3F

En C++, todos menos las referencias

Viven mientras estén en su ámbito

En Java y C#, todas las clases

En C++ sólo se implementan con punteros

En Java y C# hay recolección de basura

En C++ la recolección la hace el programador

Tipos por referencia

1c2011 10

== compara referencias

= asigna referencias

En Java, equals() compara bits

En Java, clone() copia bits

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

En Java y C#, todas las clases

En C++ sólo se implementan con punteros

En Java y C# hay recolección de basura

En C++ la recolección la hace el programador

Tipos por referencia

A3F

En Java, equals() compara bits

Recolección de basura

No determinística

Asegura que

No me voy a quedar sin memoria mientras

haya objetos sin referenciar

No se va a liberar ningún objeto que esté

1c2011 11

No se va a liberar ningún objeto que esté

siendo referenciado desde un objeto

referenciado

Extremadamente cómoda

Y evita errores muy difíciles de encontrar y

reparar

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Recolección de basura

No me voy a quedar sin memoria mientras

No se va a liberar ningún objeto que esté

A3F

No se va a liberar ningún objeto que esté

siendo referenciado desde un objeto

Y evita errores muy difíciles de encontrar y

Métodos y atributos estáticos

Métodos de clase

Para enviar mensajes a la clase

Collections.sort(lista);

Atributos de clase

1c2011 12

Atributos de clase

Para que los valores sean iguales para todos los objetos de la clase

En Java y C# se declaran “

static int numeroAcumulado

En C# puede haber propiedades de clase

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Métodos y atributos estáticos

Para enviar mensajes a la clase

A3F

Para que los valores sean iguales para todos los

En Java y C# se declaran “static”

numeroAcumulado;

En C# puede haber propiedades de clase

Definición de clases

public class CuentaBancaria {

int saldo;

public int getSaldo ( ) {

2c2009 13

public int getSaldo ( ) {

return this.saldo;

}

}

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Definición de clases

A3F

Propiedades (C#)

En vez de

public int getSaldo ( ) {

return this.saldo; // this equivale a self de Smalltalk

}

1c2011 14

Se puede usar

public int Saldo {

get { return this.saldo; }

}

También para el “setter”

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Propiedades (C#)

// this equivale a self de Smalltalk

A3F

Excepciones

Lanzamiento

if (saldo < monto)

throw new SaldoInsuficienteException ( );

Captura

1c2011 15

Captura

try {

cuenta.extraer (1000);

}

catch (SaldoInsuficienteException

e.printStackTrace();

}

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Excepciones

throw new SaldoInsuficienteException ( );

A3F

SaldoInsuficienteException e) {

Constructores (1)

public CuentaBancaria (int numero, String titular) {

this.numero = numero;

this.titular = titular;

this.saldo = 0;

}

Tiene el mismo nombre que la clase

2c2011 16

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Constructores (1)

public CuentaBancaria (int numero, String titular) {

A3F

Tiene el mismo nombre que la clase

Constructores (2)

Se usan para inicializar

Si no se implementan hay uno por omisión

Para que toda clase tenga el suyo

Pero se pueden programar otros, como hicimosPero se pueden programar otros, como hicimos

En este caso, deja de existir el default

Debería dejar al objeto en un estado válido

=> debe cumplir con los invariantes

El default no es seguro

2c2011 17

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Constructores (2)

Si no se implementan hay uno por omisión

Para que toda clase tenga el suyo

Pero se pueden programar otros, como hicimos

A3F

Pero se pueden programar otros, como hicimos

En este caso, deja de existir el default

Debería dejar al objeto en un estado válido

=> debe cumplir con los invariantes

Constructores y herencia

Los constructores no se heredan

Cada clase debe tener el suyo

Receta

Llamar al constructor del ancestro al principio del constructor propio

2c2009 18

constructor propio

“super” en Java

“base” en C#

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Constructores y herencia

Los constructores no se heredan

Cada clase debe tener el suyo

Llamar al constructor del ancestro al principio del

A3F

Visibilidad

Aplica a clases, atributos, métodos, propiedades

Privados

Sólo se ven desde su clase

Ojo que en Smalltalk es ligeramente diferente

2c2009 19

Públicos

Protegidos

Visibles sólo para las clases descendientes

De paquete

En Java es la visibilidad por defecto

En C# hay otras

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Visibilidad

Aplica a clases, atributos, métodos, propiedades

Ojo que en Smalltalk es ligeramente diferente

A3F

Visibles sólo para las clases descendientes

En Java es la visibilidad por defecto

Paquetes

Agrupación de clases, anidables

Para manejar complejidad y resolver nombres

Ejemplos:

2c2009 20

ArrayList es java.util.ArrayList (Java)

ArrayList es System.Collections.ArrayList (C#)

import java.util.*;

import java.util.ArrayList;

using System.Collections;

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Paquetes

Agrupación de clases, anidables

Para manejar complejidad y resolver nombres

A3F

ArrayList es java.util.ArrayList (Java)

ArrayList es System.Collections.ArrayList (C#)

// Java

// Java

// C#

Paquetes y fuentes

Toda clase está en un paquete

En Java existe el paquete “default”, pero no es

recomendable usarlo

En C#, se enmarca el código de la clase en una

cláusula “namespace”:

2c2009 21

cláusula “namespace”:

namespace carlosFontela.cuentas { … }

En Java, cada clase pública va en un archivo

fuente separado

El paquete se indica en una cláusula “package”

package carlosFontela.cuentas;

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Paquetes y fuentes

Toda clase está en un paquete

En Java existe el paquete “default”, pero no es

En C#, se enmarca el código de la clase en una

A3F

namespace carlosFontela.cuentas { … }

En Java, cada clase pública va en un archivo

El paquete se indica en una cláusula “package”

package carlosFontela.cuentas;

Delegación

Un objeto contiene referencias a otros objetos y les delega comportamiento

public float longitud ( ) {

return p1.distancia(p2);

}

2c2009 22

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Delegación

Un objeto contiene referencias a otros objetos y les

A3F

Herencia y lenguajes

En Java: public class Elipse extends Figura { ... }

En C#: public class Elipse : Figura { ... }

Java y C# tienen jerarquía de raíz única

Java: java.lang.Object

2c2009 23

Java: java.lang.Object

C#: System.Object

Posibilidad de evitar la herencia

Declaramos la clase como “final” (Java) o “sealed” (C#

Ejemplo: String

public final class String {...}

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Herencia y lenguajes

En Java: public class Elipse extends Figura { ... }

En C#: public class Elipse : Figura { ... }

Java y C# tienen jerarquía de raíz única

A3F

Posibilidad de evitar la herencia

Declaramos la clase como “final” (Java) o “sealed” (C#)

“Casteo” hacia arriba automático

Elipse e = new Elipse();

Figura f = e; // válido y seguro

// e = f; inválido e inseguro

Otro caso

public void p (Figura x) { … }

Objetos, tipos y clases

2c2009 24

public void p (Figura x) { … }

// … luego será invocado:

p(e); // e es de tipo Elipse

Se ven como lo que no son

f es una Elipse aunque se la trate como Figura

Figura f = new Elipse ( ); // tipos distintos en la variable y el objeto !!

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

“Casteo” hacia arriba automático

// válido y seguro

Objetos, tipos y clases

A3F

f es una Elipse aunque se la trate como Figura

// tipos distintos en la variable y el objeto !!

Redefinición en Java

Los métodos privados no pueden ser redefinidos

Se estaría definiendo uno nuevo

Posibilidad de evitar la redefinición

Métodos “final”

public final void m() {...}

2c2009 25

public final void m() {...}

“sealed” en C#

Sobrecarga y redefinición

Redefinición se hace con la misma firma

Si no, es sobrecarga

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Redefinición en Java

Los métodos privados no pueden ser redefinidos

Se estaría definiendo uno nuevo

Posibilidad de evitar la redefinición

A3F

Redefinición se hace con la misma firma

Analizar

CuentaBancaria cb = new CuentaBancaria(…);

CuentaCorriente cc1 = new CuentaCorriente(…);

CuentaBancaria cc2 = new CuentaCorriente(…);

2c2010 26

cb.extraer(200);

cc1.extraer(200);

cc2.extraer(200);

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Analizar

CuentaBancaria cb = new CuentaBancaria(…);

CuentaCorriente cc1 = new CuentaCorriente(…);

CuentaBancaria cc2 = new CuentaCorriente(…);

A3F

Métodos virtuales

En Java la “virtualidad” se da por defecto

¿Como en Smalltalk?

En C# y C++ debemos declarar métodos como “virtual”

Métodos de clase, privados y finales no son

2c2010 27

Métodos de clase, privados y finales no son virtuales

Los métodos virtuales agregan ineficiencias

Pero garantizan reutilización

Eliminar la “virtualidad” sólo si se demuestra que no se van a redefinir y la presunta ineficiencia

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Métodos virtuales

En Java la “virtualidad” se da por defecto

En C# y C++ debemos declarar métodos como

Métodos de clase, privados y finales no son

A3F

Métodos de clase, privados y finales no son

Los métodos virtuales agregan ineficiencias

Pero garantizan reutilización

Eliminar la “virtualidad” sólo si se demuestra que no se van a redefinir y la presunta ineficiencia

Ejemplo estándar en Java

En Object

public String toString ( ) { … }

System.out.println(…) usa toString()

Si quiero que un objeto sea imprimible, debo redefinir toString:

2c2010 28

toString:

En CuentaBancaria

public String toString() {

return titular;

}

Luego...

CuentaBancaria cuenta = new CuentaBancaria (12, ”Juan”);

System.out.println (cuenta);

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Ejemplo estándar en Java

System.out.println(…) usa toString()

Si quiero que un objeto sea imprimible, debo redefinir

A3F

CuentaBancaria cuenta = new CuentaBancaria (12, ”Juan”);

Clases y métodos abstractos

Se declaran “abstract”

Clases abstractas

No tienen instancias, pero pueden tener constructor

Métodos abstractos

2c2009 29

No pueden ser llamados

Deben redefinirse

Si una clase tiene un método abstracto, debe

declararse abstracta

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Clases y métodos abstractos

No tienen instancias, pero pueden tener constructor

A3F

Si una clase tiene un método abstracto, debe

Interfaces

Como mecanismo necesario para el polimorfismo sin herencia

2c2011 30

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Interfaces

Como mecanismo necesario para el polimorfismo sin herencia

A3F

Polimorfismo sin herencia (1)

El problema es que en Java hay compilación con

verificación de tipos

2c2010 31

El compilador no va a permitir una llamada a dibujar() desde un Object

¿Cómo lograr que las instancias de Figura y de DiagramaUML sean “dibujables” para el compilador?

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Polimorfismo sin herencia (1)

El problema es que en Java hay compilación con

A3F

El compilador no va a permitir una llamada a dibujar()

¿Cómo lograr que las instancias de Figura y de DiagramaUML sean “dibujables” para el

Polimorfismo sin herencia (2)

Solución:

2c2010 32

Hay una construcción llamada “interfaz”

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Polimorfismo sin herencia (2)

A3F

Hay una construcción llamada “interfaz”

Interfaces: clases muy abstractas

Son como clases

Abstractas

Con todos los métodos abstractos

Sin atributos (sin estado)

Ejemplo

2c2010 33

public interface Imprimible {

/*public abstract*/ void imprimirDatos();

}

Pueden heredar de otras interfaces

public interface Dibujable extends Imprimible {

void dibujar();

}

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Interfaces: clases muy abstractas

Con todos los métodos abstractos

A3F

/*public abstract*/ void imprimirDatos();

Pueden heredar de otras interfaces

public interface Dibujable extends Imprimible {

Herencia de interfaces

Uso

public class CajaAhorro extends CuentaBancaria implements Imprimible {

...

}

2c2010 34

}

Corolario

Si una clase declara implementar una interfaz y no implementa (redefine) uno de sus métodos es abstracta

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Herencia de interfaces

public class CajaAhorro extends CuentaBancaria

A3F

Si una clase declara implementar una interfaz y no implementa (redefine) uno de sus métodos

Interfaces: protocolos

Son grupos de métodos sin implementar

Una clase puede implementar varias

Ojo con los conflictos de nombres

2c2010 35

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Interfaces: protocolos

Son grupos de métodos sin implementar

Una clase puede implementar varias

Ojo con los conflictos de nombres

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 ( );

2c2010 36

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 clase

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

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);

A3F

lista[2] = new Fecha (8, 6, 2002);

for (int i=0; i < 3; i++) lista[i].imprimirDatos();

Ojo que sólo puedo instanciar clases

Interfaces y polimorfismo (2)

Cada objeto puede tener muchas “caras”

Fecha f = new Fecha(20,6,1964);

Imprimible i = f;

2c2010 37

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

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Interfaces y polimorfismo (2)

Cada objeto puede tener

A3F

Todos se refieren al mismo

Cada variable sólo puede usar los métodos de su interfaz

¿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

2c2010 38

Un tipo de datos que permite que ver a un mismo objeto con distintos tipos

=> Cada tipo implica un comportamiento

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

¿Qué es una interfaz?

Una clase “muy abstracta” que se puede usar para

Un tipo de datos que permite que ver a un mismo

A3F

Un tipo de datos que permite que ver a un mismo objeto con distintos tipos

=> Cada tipo implica un comportamiento

Interfaces predefinidas

Caso de Comparable

En java.lang.Comparable

interface Comparable {

int compareTo (Object o);

}

2c2010 39

}

Devuelve valores <0, 0 o >0

¡Muy útil en colecciones!

Hay otras predefinidas

Comparator, Serializable, Cloneable, etc.

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Interfaces predefinidas

int compareTo (Object o);

A3F

Devuelve valores <0, 0 o >0

Comparator, Serializable, Cloneable, etc.

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;

2c2010 40

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;

}

}

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Uso de Comparable

public class Fraccion implements Comparable {

public int compareTo(Object otro) {

A3F

if (numerador * otra.denominador > denominador * otra.numerador)

else if (numerador * otra.denominador < denominador *

Comparable y arreglos

Clase Arrays: uso

Fraccion [ ] v = new Fraccion[4];

Arrays.sort (v);

int posicion = Arrays.binarySearch (v, x);

2c2010 41

Método sort(): definición

public void sort (Comparable [ ] w) { … }

Si Fraccion implementa Comparable, puedo usar

Arrays.sort(v)

¿Y si no?

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Comparable y arreglos

Fraccion [ ] v = new Fraccion[4];

int posicion = Arrays.binarySearch (v, x);

A3F

public void sort (Comparable [ ] w) { … }

Si Fraccion implementa Comparable, puedo usar

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();

2c2010 42

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);

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Rarezas: Comparator

Si la clase de v no implementa Comparable, existe otro sort():

public void sort (Object [ ] v, Comparator c) { … }

Comparator comp = new ComparadorFracciones();

A3F

ComparadorFracciones?

Una clase que implementa java.util.Comparator…

public int compare (Object o1, Object o2);

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() )

2c2010 43

f1.getDdenominador() * f2.getNumerador() )

return 1;

else if ( f1.getNumerador() * f2.getDenominador() <

f1.getDenominador() * f2.getNumerador() )

return -1;

else return 0;

}

}

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

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() )

A3F

f1.getDdenominador() * f2.getNumerador() )

else if ( f1.getNumerador() * f2.getDenominador() <

f1.getDenominador() * f2.getNumerador() )

¿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

2c2010 44

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

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

¿Qué hicimos?

Creamos una clase ¡que no tiene estado!

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

A3F

Sólo sirve por el método que lleva dentro

Esto es un patrón de diseño: Command

Para definir otra forma de ordenamiento

Excepciones chequedas en forma estática

Mecanismo de Java

2c2011 45

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Excepciones chequedas en forma estática

A3F

Jerarquía de excepciones (Java)

2c2009 46

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Jerarquía de excepciones (Java)

A3F

Excepciones chequeadas (1)

Cláusula “throws” obligatoria

public Fraccion dividir (Fraccion y) throws FraccionInvalidaException {

if (y.numerador == 0)

throw new FraccionInvalidaException

int numerador = this.numerador * y.denominador;

2c2009 47

int numerador = this.numerador * y.denominador;

int denominador = this.denominador * y.numerador;

return new Fraccion(numerador, denominador);

}

A lo sumo se puede declarar un ancestro

En redefiniciones, mantener y no agregar

Para mantener el polimorfismo: muy molesto

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Excepciones chequeadas (1)

public Fraccion dividir (Fraccion y) throws FraccionInvalidaException {

FraccionInvalidaException ( );

int numerador = this.numerador * y.denominador;

A3F

int numerador = this.numerador * y.denominador;

int denominador = this.denominador * y.numerador;

return new Fraccion(numerador, denominador);

A lo sumo se puede declarar un ancestro

En redefiniciones, mantener y no agregar

Para mantener el polimorfismo: muy molesto

Excepciones chequeadas (2)

Obligación de capturar (I)

public Fraccion divisionMultiple ( Fraccion [ ] x, Fraccion [ ] y ) {

Fraccion suma = new Fraccion (0, 1);

try {

for (int i = 0; i < 10; i++) {

Fraccion d = x[i].dividir ( y [i] );

2c2009 48

suma = suma.sumar(d);

}

} catch (FraccionInvalidaException e) {

System.err.println(“División por cero

return new Fraccion (0, 1);

}

return s;

}

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Excepciones chequeadas (2)

public Fraccion divisionMultiple ( Fraccion [ ] x, Fraccion [ ] y ) {

A3F

e) {

n por cero”);

Excepciones chequeadas (3)

Obligación de capturar (II)

public Fraccion divisionMultiple ( Fraccion [ ] x, Fraccion [ ] y )

throws

Fraccion suma = new Fraccion (0, 1);

for (int i = 0; i < 10; i++) {

2c2009 49

for (int i = 0; i < 10; i++) {

Fraccion d = x[i].dividir( y[i] );

suma = suma.Sumar(d);

}

return s;

}

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Excepciones chequeadas (3)

public Fraccion divisionMultiple ( Fraccion [ ] x, Fraccion [ ] y )

throws FraccionInvalidaException {

Fraccion suma = new Fraccion (0, 1);

A3F

Fraccion d = x[i].dividir( y[i] );

Excepciones chequeadas (4)

Obligación de capturar (III)

public Fraccion divisionMultiple ( Fraccion [ ] x, Fraccion [ ] y) {

Fraccion suma = new Fraccion (0, 1);

try {

for (int i = 0; i < 10; i++) {

2c2009 50

for (int i = 0; i < 10; i++) {

Fraccion d = x[i].dividir( y[i] );

suma = suma.sumar(d);

}

} catch (FraccionInvalidaException

return s;

}

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Excepciones chequeadas (4)

public Fraccion divisionMultiple ( Fraccion [ ] x, Fraccion [ ] y) {

Fraccion suma = new Fraccion (0, 1);

A3F

Fraccion d = x[i].dividir( y[i] );

FraccionInvalidaException e) { }

Lenguajes y excepciones

Excepciones chequeadas

Son más seguras

Molesta tener que capturarlas sí o sí

Limita la redefinición, al no poder agregar nuevas

excepciones

2c2009 51

excepciones

Aunque cumple el principio de substitución

Microsoft diseñó .NET sin excepciones chequeadas

Ojo: Java permite ambas

Aunque es una decisión de diseño

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Lenguajes y excepciones

Molesta tener que capturarlas sí o sí

Limita la redefinición, al no poder agregar nuevas

A3F

Aunque cumple el principio de substitución

Microsoft diseñó .NET sin excepciones chequeadas

Aunque es una decisión de diseño

Colecciones, iteradores y genericidad

2c2011 52

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Colecciones, iteradores y genericidad

A3F

Colecciones de java.util (1)

Las más

comunes de

Java 1.4:

2c2009 53

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Colecciones de java.util (1)

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.

2c2009 54

No admiten elementos primitivos.

Pero hay clases envolventes: Integer, Boolean, Double,

Character, etc.

Colecciones heredadas:

Vector, Hashtable, Stack, BitSet, Properties, etc.

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Colecciones de java.util (2)

Tienen elementos de tipo Object.

No se sabe qué hay dentro

“Casteo” para obtener utilidad

No admiten elementos primitivos.

A3F

No admiten elementos primitivos.

Pero hay clases envolventes: Integer, Boolean, Double,

Vector, Hashtable, Stack, BitSet, Properties, etc.

Objetos que saben cómo recorrer una colección, sin ser parte de ella

Interfaz:

Tomar el primer elemento

Tomar el elemento siguiente.

Iteradores: definición y uso

2c2009 55

Chequear si se termina la colección

Un ejemplo:

List vector = new ArrayList();

for(int j = 0; j < 10; j++) vector.add(

Iterator i = vector.iterator(); // pido un iterador para v

while ( i.hasNext() ) // recorro la colección

System.out.println( i.next() );

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Objetos que saben cómo recorrer una colección,

Tomar el elemento siguiente.

Iteradores: definición y uso

A3F

Chequear si se termina la colección

.add(j);

// pido un iterador para vector

// recorro la colección

Iteradores y colecciones

Toda clase que implemente Collection puede generar un Iterator con el método iterator

+next() : Object

«interface»

Iterator

«uses»

2c2009 56

Nótese que Iterator es una interfaz

Pero está implementada para las colecciones definidas en java.util.

+hasNext() : boolean

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Iteradores y colecciones

Toda clase que implemente Collection puede generar un Iterator con el método iterator

+iterator() : Iterator

«interface»

Collection

«uses»

A3F

Nótese que Iterator es una interfaz

Pero está implementada para las colecciones

+iterator() : Iterator

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

2c2009 57

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

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Iteradores: para qué

Llevan la abstracción a los recorridos de colecciones

Facilitan cambios de implementación

Collection lista = new ArrayList ( );

// pido un iterador para

A3F

// recorro la colección

);

No se necesita trabajar con el número de elementos

Convierten a las colecciones en simples secuencias

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

2c2009 58

Es un caso particular de LinkedList

¿Qué cambia?

¿Nada?

¿Sólo la forma de recorrerla?

=> El iterador es diferente

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

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

A3F

Es un caso particular de LinkedList

¿Sólo la forma de recorrerla?

=> El iterador es diferente

Ejercicio: lista circular (2)

2c2009 59

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Ejercicio: lista circular (2)

A3F

Ejercicio: lista circular (3)

public class ListaCircular extends LinkedList {

public Iterator iterator( ) {

return new IteradorListaCircular(this);

}

2c2009 60

}

}

Implementar la clase IteradorListaCircular

Con sus métodos next() y hasNext()

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Ejercicio: lista circular (3)

public class ListaCircular extends LinkedList {

public Iterator iterator( ) {

return new IteradorListaCircular(this);

A3F

IteradorListaCircular

Con sus métodos next() y hasNext()

Ejercicio lista circular: otra visión

2c2009 61

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Ejercicio lista circular: otra visión

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”;

2c2009 62

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);

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Genericidad (1)

Los tipos pueden ser parámetros de clases y

Ejemplo Java sin genericidad:

List v = new ArrayList( ); String s1 = “Una cadena”;

A3F

v.add(s1); String s2 = (String)v.get(0);

Ejemplo Java con genericidad:

List<String> v = new ArrayList<String>( );

// el compilador verifica que s1 sea un String

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

2c2009 63

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) { … }

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Genericidad (2)

En métodos, el compilador infiere el tipo genérico:

public static <T> void eliminarElemento (List<T> lista, int i) { … }

A3F

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) { … }

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

2c2009 64

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

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Genericidad: Java vs. .NET

Java usa la genericidad sólo para tiempo de

No llega al bytecode => compatibilidad hacia atrás

No hay información del tipo completa en tiempo de

A3F

No hay información del tipo completa en tiempo de

.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

Ventajas del tipeo estático

Hay un chequeo antes de la ejecución

Cuanto antes surja un error, más económico es corregirlo

El compilador es un primer verificadorEl compilador es un primer verificador

Incluso puede advertir potenciales problemas =>

“warnings”

2c2011 65

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Ventajas del tipeo estático

Hay un chequeo antes de la ejecución

Cuanto antes surja un error, más económico

El compilador es un primer verificador

A3F

El compilador es un primer verificador

Incluso puede advertir potenciales problemas =>

Claves

Lenguajes de tipos estáticos: hay chequeo de tipos al compilar

Algunos lenguajes tienen tipos por valor

O tienen tipos que no son clases

2c2011 66

O tienen tipos que no son clases

Hay mayores niveles de visibilidad

Algunas asignaciones requieren “casteo”

Polimorfismo seguro y sin herencia: interfaces

Java tiene chequeo estático de excepciones

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Claves

Lenguajes de tipos estáticos: hay chequeo de

Algunos lenguajes tienen tipos por valor

O tienen tipos que no son clases

A3F

O tienen tipos que no son clases

Hay mayores niveles de visibilidad

Algunas asignaciones requieren “casteo”

Polimorfismo seguro y sin herencia: interfaces

Java tiene chequeo estático de excepciones

Lecturas obligatorias

“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++ Anders Hejlsberg, by Bill Venners with Bruce Eckel", http://www.artima.com/intv/genericsP.html.

2c2011 67

Eckel", http://www.artima.com/intv/genericsP.html.

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Lecturas obligatorias

“A Comparative Analysis of Generic Programming Paradigms in C++, Java and C#”, Arijit Khan and

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.

A3F

Eckel", http://www.artima.com/intv/genericsP.html.

Lecturas opcionales

Carlos Fontela, “Orientación a objetos y programación”

Todos los capítulos de la segunda parte

Bruce Eckel, “Thinking in Java” o “Piensa en

2c2011 68

Bruce Eckel, “Thinking in Java” o “Piensa en Java”

Todo el libro

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Lecturas opcionales

Carlos Fontela, “Orientación a objetos – Diseño

Todos los capítulos de la segunda parte

Bruce Eckel, “Thinking in Java” o “Piensa en

A3F

Bruce Eckel, “Thinking in Java” o “Piensa en

Qué sigue

Desarrollo de software y programación

Temas de diseño

2c2011 69

RTTI, reflexión

No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.

Qué sigue

Desarrollo de software y programación

A3F