¿Como funcionan la malditas referencias en Java?
Este escrito te explica como funcionan las referencias en java. Una de los problemas que tienen los que están aprendiendo a programar son las referencias, pues estas se ocultan en la sintaxis del lenguaje de tal forma que se confunde con el concepto de objeto, complicando las cosas cuando se están trabajando estructuras de datos complejas.
Y empecemos de una vez. Veamos la primera ilustración.
Tanto esta ilustración como las siguientes usan como lenguaje gráfico el UML, más exactamente los diagramas de objetos, y en los comentarios UML se usan para el código en lenguaje Java. Este código se encuentra en la primera columna de la izquierda y en la de la derecha está la representación gráfica de lo que hace el el código de la izquierda. Por ejemplo, en la columna izquierda está una declaración de clase y en la derecha está la clase en UML. Todo el código a continuación se basará en esta definición de clase. Veamos la siguiente sentencia.
En el código java tenemos una declaración de una referencia, la v1, que va ha referenciar objetos de clase C1. Fíjate que en la representación gráfica solo tenemos una flecha y ese es lo que es una referencia algo que «señala» que referencia a otro algo que es un objeto. Fíjate además que la flecha, la referencia, está apuntando a algo que se llama null, esto quiere decir que la referencia v1 no está referenciando a algún objeto.
En la anterior se crea un objeto, el que aparece en verde, y mediante la asignación (el igual) se pone a referenciar a v1 ese objeto verde. Fíjate que hasta que no se hace un new la referencia no tenía ningún objeto. Es el new el que crea lo objetos.
Para que veas la diferencia mira el siguiente dibujo.
En éste tenemos otra referencia la v2 y se pone a referenciar al mismo objeto verde mediante una asignación.
Ahora declaramos una nueva referencia, la v3, y la ponemos a null explicítamente. Si bien el java hace esto automáticamente para toda nueva referencia es una buena práctica hacerlo explícitamente.
Ahora tenemos dos sentencias java: la primera asigna el valor 5 al objeto verde mediante la referencia v2. Este «mediante» es importante por que es por medio de las referencias que hacemos cosas a los objetos. La segunda sentencia cambia a donde está referenciando v1, la pone a null.
En esta nueva ilustración tenemos algo más Complejo. Estemos declarando una arreglo de objetos C1, que en el momento esta referenciado por a1. Importante, cada una las las posiciones del arreglo es en realidad una referencia. Esto lo vemos mejor en las siguientes imágenes.
En la anterior adicionamos un elemento al arreglo referenciado por a1. Fíjate que lo que realmente hace es hacer que la posición cero del arreglo referencia al objeto verde.
Aquí creamos un nuevo objeto, el dorado, y lo referenciamos con v1.
Y mediante esta nueva referencia cambiamos el atributo val del objeto dorado.
Ahora creamos un nuevo objeto, el verde militar, pero mira que usamos v1 que estaba antes referenciando al objeto dorado. ¡El objeto dorado queda ahora sin ninguna referencia! Y usando la misma v1 cambiamos el atributo val del objeto verde militar, como está referenciando otro objeto distinto pues cambia ese objeto.
Por otro lado, Mira lo que pasa con el objeto dorado en la siguiente ilustración.
¡Desaparece!
Cuando un objeto se queda sin referencias después de un tiempo pasa el Recolector de basura y libera el espacio ocupado por él, esto es ese espacio de memoria puede usarse para un nuevo objeto.
En esta nueve ilustración creamos un nuevo arreglo, el azul, que está referenciado por a2.
Aquí se crea un nuevo objeto, el morado, referenciado por v3 y además se modifica el atributo val mediante esa referencia.
Ahora se adiciona la referencia al objeto morado, esta referencia queda en los posición cero del arreglo.
Se hace lo mismo pero esta vez referenciando al objeto verde militar y ésta referencia queda en la posición uno.
Ahora una tercera vez pero referenciando al objeto verde.
Ahora la referencia a1 la ponemos al arreglo azul, así que el arreglo inicial se queda sin referencias, y ya debes saber que pasa a coninuación.
¡Pasa el recolector de basura y desaparece el arreglo!
En esta imagen v2 se pone a referenciar al objeto morado, que también está referenciado por la posición cero del arreglo azul.
Aquí removemos las referencia de las posiciones uno y dos del arreglo azul. Mira como el objeto verde queda sin referencias.
Y pasa el recolector de basura.
Y finalmente se modifica al atributo val mediante del objeto verde militar mediante la referencia v1.
Y eso es todo. Puedes seguir desarrollando el ejemplo su quieres.
Y para terminar un consejo. Cuando estás trabjando con referencias en especial con estructuras de datos puedes entender más lo que está pasando si haces dibujos. No tiene que ser necesariamente en UML, pero haz dibujos verás que aprenderás mucho con ello.
En necesario mencionar que este ejemplo fue tomado del libro Introducción a las Estructuras de Datos: Aprendizaje Activo Basado en Casos
de Jorge A. Villalobos S., uno de los mejores libros que se han escrito sobre estructuras de datos. Lo digo no por que sea un libro erudito sobre la materia, sino por que tiene una propuesta educativa con la cual los estudiantes si aprenden.