RTTI y reflexin Modelos de datosCarlos Fontela [email protected]
A3F
TemarioRTTI (informacin de tipos en tiempo de ejecucin)Reflexin Modelo de datos y memoria de Java
Otros modelos
1c2010
2
A3F
Transformaciones de tiposTransformacin automticaElipse e = new Elipse();
Figura f = e;
Transformacin explcitaElipse e2 = (Elipse)f; // f.setRadioMayor(3); f es una Elipse, pero...(Elipse)f.setRadioMayor(3);
Se hace chequeo Todo objeto conoce su tipo! El tipo del objeto nunca cambia! Cmo es esto? => RTTI
1c2010
3
A3F
RTTI (1)Hay una clase Class y est ObjectCuando se crea un objeto, se guarda en un atributo de Object una referencia a un objeto ClassEl objeto Class se crea al compilar la clase
1c2010
4
A3F
RTTI (2)Versin no polimorfa:if (f.getClass( ) == Elipse.class) return ((Elipse) f).getCentro( ); if (f.getClass( ) == Class.forName("Elipse")) return ((Elipse) f).getCentro( );
Versin polimorfa:if (x instanceof Elipse) return ((Elipse) f).getCentro( );
C#No polimorfo: GetType() Polimorfo: operador is
1c2010
5
A3F
Reflexin (1)Cosas raras (faltan excepciones):public void metodoRaro (Object o1) throws Exception { Class claseAncestro = o1.getSuperclass();
Object o2 = claseAncestro.newInstance();Method m = o2.getClass().getConstructors()[0]; m.invoke();
}
1c2010
6
A3F
Reflexin (2)RTTI: el compilador debe conocer los tipos
Qu pasa si recibo un objeto por una red?Puedo obtener el objeto Class y preguntar por mtodos, atributos, interfaces, etc.
Paquete java.lang.reflectLa informacin debe estar en tiempo de ejecucin En general se maneja en forma automticaInterrogacin a componentes para saber qu eventos soporta 1c2010 7
A3F
Reflexin (3)ClasesMethod, Constructor, Field
MtodosgetMethods(), getConstructors(), getFields(), getInterfaces(), getSuperclass() newInstance()En clase Field: get() y set() En clase Method: invoke()
Mucho ms1c2010
8
A3F
Un uso de reflexin: creacin de objetosFraccion f = new Fraccion();
La clase est especificada en el cdigo y se conoce en tiempo de compilacin Qu pasara si hicisemos?:Serializable f = x.crearObjeto(); // Serializable es una interfaz
El mtodo podra ser:public Serializable crearObjeto ( ) { String nombreClase = leerArchivoConfiguracion(); Class claseInstanciar = Class.forName(nombreClase); Object nuevo = claseInstanciar.newInstance(); return (Serializable) nuevo; }
Ahora la clase se conoce recin en tiempo de ejecucin1c2010
9
A3F
Reflexin: ya la usamos?Framework JUnitCmo funciona?
Usa polimorfismoMtodos setUp() y tearDown()
Y reflexinMtodos public void testXxx()
Algo bastante comn en todos los frameworks1c2010
10
A3F
EncajonamientoAutoboxing(la traduccin es ma)
Javaint x = 4; Integer i = x; // equivale a Integer i = new Integer(x);
int y = (int) i; // equivale a int y = i.intValue( ); Collection le = new ArrayList( ); le.add(5);
1c2010
11
A3F
Otros lenguajesC#Misma funcionalidad que en Java Encajonamiento con mejor desempeo
Los arreglos primitivos son todos subclases de System.ArrayTodos los tipos por valor heredan de System.ValueType
C++Poca informacin de tipos y sin reflexinDistintas formas de transformaciones de tipos: muy complejo No hay encajonamiento ni todos los tipos son clases1c2010
12
A3F
Malos usos: ojo con RTTICompromete la extensibilidadpublic Punto algunaPosicion ( ) { if (this instanceof Elipse) return ((Elipse) this).getCentro( ); if (this instanceof Poligono) return ((Poligono) this).getContorno( )[0]; throw new IllegalArgumentException( ); }
Evita el polimorfismoif (x instanceof Elipse) ((Elipse)x).dibujar( );
Muy contrario a POO en general1c2010
13
A3F
Malos usos: ojo con reflexinPodemos terminar generando cualquier cosaSndrome del elefante alado
Difcil de testear Difcil de leer No cualquiera la usa bien1c2010
14
A3F
Modelo de memoria de JavaReferenciasOjo con comparaciones== y equals()
Ojo con asignaciones= y clone()
Recoleccin de basuraOjo con acciones finalesfinalize(), System.runFinalization() y System.gc()1c2010
15
A3F
Igualdad e identidadif (a == b)if a.equals(b)
// compara referencias// compara contenido
equals:Est definido en ObjectEst implementado en colecciones
No hace comparaciones profundas
1c2010
16
A3F
Asignacin simpleObject a = b; // asigna referencias Object o, b; o.m(b); // b pasa como referencia int x = y;// asigna valores int y; Object o; o.m(y);1c2010
// y pasa como valor17
A3F
Clonacina = b.clone();
En Object est definido:protected Object clone() throws CloneNotSupportedException{ // hace una copia de bits... }
Hay que redefinir clone como pblico y que llame a super.clone() Si quiero una copia profunda, implementarlaVer ejemplo en libros
Hay que implementar CloneableSi no, obtenemos CloneNotSupportedException1c2010
18
A3F
Recoleccin de basuraNo determinstica Asegura queNo me voy a quedar sin memoria mientras haya objetos sin referenciar No se va a liberar ningn objeto que est siendo referenciado desde un objeto referenciado
Extremadamente cmoda Y evita errores muy difciles de encontrar y reparar
1c2010
19
A3F
Finalizacin: finalize()No es un destructor
Se ejecuta cuando pasa el recolector de basuraNo sabemos cundo
Puede que nuncaNo sabemos nada del orden, como para llamar un finalize() desde otro finalize()
Solucin a medias para liberar recursos1c2010
20
A3F
Liberacin forzadaSystem.gc();JVM hace su mejor esfuerzo por recolectar todo.Lleva mucho tiempo. Puede usarse antes de crear una gran estructura.
System.runFinalization();JVM hace su mejor esfuerzo por finalizar todo, sin recolectar.
Iguales consideraciones.1c2010
21
A3F
C# (1)El modelo es de referencias para clases y otros tiposCon recoleccin automtica de basura Hay destructores, pero es otro nombre para un finalizador Hay mtodos Clone y Equals
Pero tambin sobrecarga de == y !=
1c2010
22
A3F
C# (2)Hay tipos de datos estticosstructs, enums, etc.
Se manejan como en C++Pueden implementar interfaces
Pero no tienen herencia
Hay aritmtica de punterosunsafe, fixed, y otras restricciones
1c2010
23
A3F
Object PascalEl modelo es de referenciasPero hay clases por valor
No hay recoleccin automtica de basuraSe deben crear destructoresEn general son virtuales y se los llama desde un mtodo Free destructor Destroy; virtual;
Hay aritmtica de punterosPor herencia de Borland Pascal1c2010
24
A3F
C++El modelo es estticoPero hay punteros
Existen los destructoresNo necesariamente para liberar memoria
Hay aritmtica de punteros
1c2010
25
A3F
SmalltalkEl modelo es de referencias
Hay recoleccin automtica de basuraEs un lenguaje de tipos dinmicosPolimorfismo automtico
No hay aritmtica de punteros Interpretado
1c2010
26
A3F
ClavesTodo objeto conoce su tipo, y es permanente: RTTI Se le puede preguntar de todo a un objeto: reflexin Usar RTTI y reflexin con medida La clonacin y equals() solucionan problemas de usar referencias finalize(), gc() y runFinalization() proveen sucedneos a medias de los destructores1c2010
27
A3F
Lecturas opcionalesThinking in Java, Bruce EckelCaptulo 4, Initialization & Cleanup Captulo 12, Run-time Type Identification Apndice A, Passing & Returning Objects Est en biblioteca Hay versin castellana
Orientacin a objetos, diseo y programacin, Carlos Fontela 2008Captulo 20 Los datos, los tipos y la memoria
1c2010
28
A3F
Qu sigue
1c2010
29
A3F
Top Related