2011-12-29 14 views

Respuesta

4

Para agregar campos dinámicos a los objetos.

Algunos idiomas soportan directamente campos dinámicos: cualquiera puede agregar cualquier campo a cualquier objeto en cualquier momento.

Esto es útil cuando desea asociar algo de información a los objetos, imprevisible por el diseñador de objetos.

Java no tiene un campo dinámico real. Podemos simularlo usando un mapa de identidad para asociar un objeto a cierta información de algún tipo.

WeakHashMap es mejor para el propósito; también es un mapa de identidad y no agrega una referencia fuerte adicional al objeto. Por lo tanto, está mucho más cerca del concepto de campo dinámico.

La simultaneidad es el problema restante. Si dos subprocesos acceden al mismo campo dinámico de dos objetos diferentes, no deberían existir dependencias entre dos subprocesos. Podemos resolverlo mediante algún tipo de hashmap débil concurrente. Sin embargo, el rendimiento no es ideal en comparación con el acceso de campo normal.

Piense en java.lang.ThreadLocal, agregando campo dinámico a los hilos; y java.lang.ClassValue, agregando un campo dinámico a las clases. No son estrictamente necesarios: podemos lograr lo mismo con mapas débiles concurrentes. Existen por razones de rendimiento. JDK puede "piratear" en Thread/Class para agregar soportes para lograr una búsqueda más rápida.

+1

Sobre ella se afirma que 'WeakHashMap'" es también un mapa de identidad " .Este no es el caso, de hecho, en el error [4500542] (http://bugs.sun.com/view_bug.do?bug_id=4500542) en el DB de errores de Java reconocen que probablemente debería haber sido uno pero no lo es. t. Para un hashmap de identidad débil, consulte el javadoc para la clase MapMaper de Guava (el bit sobre 'nuevo MapMaker(). WeakKeys(). MakeMap()'). –

8

Tener un vistazo a la Java Docs :-)

Un uso típico de esta clase es la topología de preservación gráfico de objetos transformaciones, como la serialización o de alta copia. Para realizar tal transformación, un programa debe mantener una "tabla de nodos" que realiza un seguimiento de todas las referencias de objetos que ya han sido procesadas . La tabla de nodos no debe equiparar objetos distintos aunque sean iguales. Otro uso típico de esta clase es mantener objetos proxy. Por ejemplo, una instalación de depuración podría desear para mantener un objeto proxy para cada objeto en el programa que está siendo depurado .

En una nota: está disponible desde la versión 1.4, no Java 5 o 6 ...

2

Cuando seria objetos mutables que desea hacer un seguimiento de los objetos que ha serializado y su ID de referencia. No puede usar la igualdad ya que no puede confiar en los objetos mutables para usar las verificaciones de identidad para los iguales y para no cambiar. p.ej. La fecha es mutable e iguala los contenidos.