2011-12-29 14 views

risposta

4

Per aggiungere campi dinamici agli oggetti.

Alcune lingue supportano direttamente i campi dinamici: chiunque può aggiungere qualsiasi campo a qualsiasi oggetto in qualsiasi momento.

Questo è utile quando si desidera associare alcune informazioni per gli oggetti, unforseenable da oggetto di design.

Java non ha campo dinamico reale. Possiamo simularlo usando una mappa di identità per associare un oggetto ad alcune informazioni di qualche tipo.

WeakHashMap è migliore per lo scopo; è anche una mappa di identità e non aggiunge un riferimento forte aggiuntivo all'oggetto. Quindi è molto più vicino al concetto di campo dinamico.

La concorrenza è il problema rimanente. Se due thread accedono allo stesso campo dinamico di due oggetti diversi, non ci dovrebbero essere dipendenze tra due thread. Possiamo risolverlo con qualche tipo di hashmap concomitante debole. Tuttavia, le prestazioni non sono ideali rispetto al normale accesso al campo.

Pensate a java.lang.ThreadLocal, aggiungendo il campo dinamico ai thread; e java.lang.ClassValue, aggiungendo campo dinamico alle classi. Non sono strettamente necessari: possiamo ottenere la stessa cosa con mappe deboli concorrenti. Esistono per ragioni di prestazione. JDK può "hackerare" in Thread/Class per aggiungere supporti per ottenere una ricerca più rapida.

+1

Abover afferma che 'WeakHashMap'" è anche una mappa di identità " .Questo non è il caso - infatti in bug [4500542] (http://bugs.sun.com/view_bug.do?bug_id=4500542) nel DB degli errori Java essi riconoscono che probabilmente avrebbe dovuto essere uno ma non è t. Per un'identità debole, l'hashmap visualizza javadoc per la classe Guava MapMaper (il bit su 'new MapMaker(). WeakKeys(). MakeMap()'). –

8

Date un'occhiata al Java Docs :-)

Un utilizzo tipico di questa classe è topologia-preservare oggetto grafico trasformazioni, come la serializzazione o deep-copia. Per eseguire una trasformazione di questo tipo, un programma deve mantenere una "tabella di nodi" che tenga traccia di tutti i riferimenti oggetto che sono già stati elaborati . La tabella dei nodi non deve equiparare oggetti distinti anche se sono uguali. Un altro uso tipico di questa classe è di mantenere oggetti proxy. Ad esempio, una funzione di debug potrebbe desiderare che mantenga un oggetto proxy per ogni oggetto nel programma che sia sottoposto a debug di .

Su un lato nota: è disponibile a partire dalla versione 1.4, non Java 5 o 6 ...

2

Quando la serializzazione di oggetti mutabili si desidera tenere traccia degli oggetti che avete serializzati e il loro ID di riferimento. Non è possibile utilizzare l'uguaglianza in quanto non ci si può fidare che gli oggetti mutabili usino controlli di identità per uguali e che non cambino. per esempio. La data è mutabile e equivale al confronto dei contenuti.