Documentos de Académico
Documentos de Profesional
Documentos de Cultura
A3F
Temario
RTTI (informacin de tipos en tiempo de ejecucin)
Reflexin Modelo de datos y memoria de Java
Otros modelos
1c2010
A3F
Transformaciones de tipos
Transformacin automtica
Elipse e = new Elipse();
Figura f = e;
Transformacin explcita
Elipse 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
A3F
RTTI (1)
Hay una clase Class y est Object
Cuando se crea un objeto, se guarda en un atributo de Object una referencia a un objeto Class
El objeto Class se crea al compilar la clase
1c2010
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
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
A3F
Reflexin (2)
RTTI: el compilador debe conocer los tipos
Paquete java.lang.reflect
La informacin debe estar en tiempo de ejecucin En general se maneja en forma automtica
Interrogacin a componentes para saber qu eventos soporta 1c2010 7
A3F
Reflexin (3)
Clases
Method, Constructor, Field
Mtodos
getMethods(), getConstructors(), getFields(), getInterfaces(), getSuperclass() newInstance()
En clase Field: get() y set() En clase Method: invoke()
Mucho ms
1c2010
A3F
A3F
Reflexin: ya la usamos?
Framework JUnit
Cmo funciona?
Usa polimorfismo
Mtodos setUp() y tearDown()
Y reflexin
Mtodos public void testXxx()
10
A3F
Encajonamiento
Autoboxing
(la traduccin es ma)
Java
int x = 4; Integer i = x; // equivale a Integer i = new Integer(x);
1c2010
11
A3F
Otros lenguajes
C#
Misma funcionalidad que en Java Encajonamiento con mejor desempeo
C++
Poca informacin de tipos y sin reflexin
Distintas formas de transformaciones de tipos: muy complejo No hay encajonamiento ni todos los tipos son clases
1c2010
12
A3F
Evita el polimorfismo
if (x instanceof Elipse) ((Elipse)x).dibujar( );
13
A3F
14
A3F
Recoleccin de basura
Ojo con acciones finales
finalize(), System.runFinalization() y System.gc()
1c2010
15
A3F
Igualdad e identidad
if (a == b)
if a.equals(b)
// compara referencias
// compara contenido
equals:
Est definido en Object
Est implementado en colecciones
1c2010
16
A3F
Asignacin simple
Object 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
A3F
Clonacin
a = b.clone();
Hay que redefinir clone como pblico y que llame a super.clone() Si quiero una copia profunda, implementarla
Ver ejemplo en libros
18
A3F
Recoleccin de basura
No determinstica Asegura que
No 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
1c2010
19
A3F
Finalizacin: finalize()
No es un destructor
20
A3F
Liberacin forzada
System.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 tipos
Con recoleccin automtica de basura Hay destructores, pero es otro nombre para un finalizador Hay mtodos Clone y Equals
1c2010
22
A3F
C# (2)
Hay tipos de datos estticos
structs, enums, etc.
1c2010
23
A3F
Object Pascal
El modelo es de referencias
Pero hay clases por valor
24
A3F
C++
El modelo es esttico
Pero hay punteros
1c2010
25
A3F
Smalltalk
El modelo es de referencias
1c2010
26
A3F
Claves
Todo 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 destructores
1c2010
27
A3F
Lecturas opcionales
Thinking in Java, Bruce Eckel
Captulo 4, Initialization & Cleanup Captulo 12, Run-time Type Identification Apndice A, Passing & Returning Objects Est en biblioteca Hay versin castellana
1c2010
28
A3F
Qu sigue
1c2010
29
A3F