poo en lenguajes de tipos estáticos -...
Post on 20-Sep-2018
229 Views
Preview:
TRANSCRIPT
POO en lenguajes de tipos
estáticosestáticos
Carlos Fontela
cfontela@fi.uba.ar
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
cfontela@fi.uba.ar
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
top related