InicioApuntes Y Monografias==, HashCode y problema de referencia
Conceptos (De manera simplificada)


HashCode

El hashcode, como está implementado en hashCode() en la clase Object, es un mapping de la dirección de memoria a un valor de integer. Se beneficia de estructuras como la tabla de hashing (HashTable), que no voy a explicar ahora porque se haría bardero el post.

==

En C++ este operador, además de poder ser sobrecargado, compara mediante el valor de los operandos. En Java, == compara por los valores de referencia, que son a grandes rasgos, la "direccion" de las instancias.

Si uno no redefine el metodo equals(), como todas las clases heredan de Object, se usa la implementación de Object, que utiliza ==. Por lo tanto, equals() devolverá true si las referencias son iguales. Como String es un objeto en java, equals() está redefinido.

Problema concreto con codigo propio


Como el ejemplo no tiene un contexto en el mundo real, los nombres y la implementacion de las clases están forzadas para mostrar el problema. Por ejemplo, ListaNombre podrías manejarla nada mas con una lista y no necesitas una clase.

El problema en cuestión: Uno puede modificar el estado interno de los objetos de manera indirecta (sin utilizar los metodos definidos), debido al manejo de referencias en java.







En linea 6,7 se declara y definen los nombres(String).
En linea 9 se comparan las referencias, y se muestra que es 2320088. Esto tiene sentido ya que java para dos strings iguales, utiliza la misma referencia. Es decir, al definir pedro="Juan", lo que hago es usar la referencia del "Juan" anterior.
En linea 12,13 se crean instancias de la clase Nombre.
En linea 15,16 se muestra que los nombre que tenian, eran los dos juan, y tienen el mismo hashcode.
En linea,18,19,20 se crea una instancia de ListaNombre(ListaJP) y se agregan las intancias de NombreJuan y NombrePedro.
En linea 22,23 voy a mostrar los contenidos de ListaJP. Como es una clase, voy a acceder a los atributos mediante metodos. No podría poner Nombres.get(0) ya que debo mantener la estructura encapsulada dentro de la clase.

En linea 25, que es lo que desata el problema, es que le cambio el nombre al objeto NombreJuan. Normalmente, esto no debería afectar a ListaJP, porque la estructura que almacena los Nombres es privada y solo puedo acceder mediante metodos. Sin embargo, al imprimir devuelta los valores:
"Ya no es juan 1423....."



Que pasó amiguito?


El Nombre en la estructura de vector de ListaJP, es una referencia al objeto NombreJuan. Por lo tanto, al cambiar los atributos de NombreJuan mediante los metodos, se hace una cascada de modificaciones, y despues tenes todo un programa con valores chotos y dificil de debuggear.

Alguna solucion?


Podrías usar el metodo clone() que está en Object, con algunos cambios a gusto (lo redefinis).

Me estoy complicando la vida?


Seguramente. Pero la persona que use tus clases va a esperar un comportamiento distinto al que se le presenta, despues no va a saber como debuggear. En situaciones reales, cuando uno tiene herencias enormes y clases dando vuelta por todos lados, una cascada de modificaciones de este estilo puede joder toda la ejecucion.

Esto es realmente un problema?


Depende como programe cada uno, si a los atributos de la clase los definis como publico esto es solo una partesita de todo el problema que se genera al romper el encapsulamiento. Java permite atributos publicos, pero nos estamos cagando en el paradigma orientado a objetos y generando bombas de tiempo a futuro. Este problema cambia la estructura interna de los objetos de manera indirecta, los atributos publicos posibilitan hacerlo de manera directa.

PD: Cuando se mencióno publico, es solo public. Hay casos de publicos que no rompen encapsulamiento, como Math.PI, que es una constante.


Gracias por pasar, nos re vimos.


Datos archivados del Taringa! original
55puntos
140visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
0visitas
0comentarios
Dar puntos:

Posts Relacionados

Dejá tu comentario

0/2000

No hay comentarios nuevos todavía

Autor del Post

M
MPucheta🇦🇷
Usuario
Puntos0
Posts16
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.