Esiste una situazione in cui sarebbe meglio usare riferimenti deboli invece di una semplice composizione?


10

Sebbene i documenti Java specifichino che i riferimenti deboli sono principalmente per la mappatura canonica, troverete molte , molte , molte persone su Internet che affermano che WeakHashMap è perfetto per archiviare i metadati degli oggetti durante la sua vita. Tuttavia, nessuno si preoccupa di fare un esempio comprensibile E appropriato .

Usando WeakHashMap per aggiungere oggetti a me alcune proprietà o archiviare i suoni dei metadati, come una decisione arbitraria basata sulla volontà di usare solo quella dannata cosa. In altre parole: un cattivo design . Capisco che ci sono situazioni in cui l'ereditarietà potrebbe non essere disponibile (classi finali, interfacce), ma per quanto riguarda la composizione? Non riesco a pensare a un esempio in cui la composizione non sarebbe un'opzione. E sicuramente migliore, perché si basa su un principio ben consolidato, anziché su una "stranezza linguistica".

Quindi, c'è una situazione in cui sarebbe meglio usare riferimenti deboli invece di una semplice composizione? In caso contrario, perché tutti su Internet sembrano sbagliare?


Errore logico: "... decisione arbitraria basata sulla volontà di usare solo la dannata cosa. In altre parole, un cattivo design." I fini potrebbero non giustificare i mezzi, ma i mezzi non sono sufficienti per invertire i fini. Dati gli stessi metodi, il risultato potrebbe ipoteticamente essere un buon progetto. Anche se per questo caso non lo direi. :)
cwharris,

3
I riferimenti deboli sono un concetto ortogonale di composizione ed eredità.
Robert Harvey,

Risposte:


13

Diciamo che devo associare alcuni metadati ad alcuni oggetti dati. Questo è uno scenario abbastanza comune. Non controllo gli oggetti dati, e ce ne sono molti, e l'API in questione (callback, metodi virtuali, ecc.) Mi offre quegli oggetti dati, ma senza i miei metadati. Quindi, ho bisogno di tenere traccia di uno stato per ciascuno di quegli oggetti dati, vale a dire quelli che ho visto prima e che potrebbero vedere di nuovo. Chiamerò questi metadati un ornamento, che a volte è un termine usato per quel concetto.

La composizione semplice fornisce una facile ricerca dall'oggetto decorativo (quello con i metadati) all'altro oggetto (quello con i dati), con la presunzione che da quando controllo il design dell'oggetto dei metadati, posso inserire in esso un riferimento direttamente all'oggetto dati .

Tuttavia, a meno che non si controlli la progettazione dell'oggetto dati e non sia possibile modificarlo, la composizione semplice non fornisce la ricerca inversa (dall'oggetto dati ad alcuni metadati). Infatti, a meno che non si disponga di una raccolta di oggetti metadati, non è nemmeno possibile individuare l'elemento dei metadati associato dato un oggetto (dati).

Oltre al problema della ricerca nella direzione che va dall'oggetto per trovare i suoi metadati ornamentali, esiste anche il problema della durata dei metadati.

I metadati che si accumulano e non vengono mai rilasciati anche quando l'oggetto dati non viene più utilizzato rappresentano una perdita di memoria.

Una hashmap di riferimento debole risolve entrambi i problemi. Permette di localizzare i metadati dati i dati e consente ai metadati di essere liberati in qualche momento dopo che i dati sono stati liberati.

Si noti inoltre che un hashmap di riferimento debole consente non solo di recuperare i valori (metadati) (gc'ed), ma anche di recuperare (gc'ed) le chiavi (dati), poiché se le chiavi fossero conservate sarebbe anche un perdita di memoria e, inoltre, i valori non potrebbero mai essere rilasciati.


Perché l'uso degli oggetti dati con una tabella di metadati con supporto hashmap debole non conta come composizione?
Jack

2
@Jack, Composizione, in particolare almeno "composizione semplice" nella mia mente, sono oggetti che si riferiscono ad altri oggetti, ma direttamente così. La relazione "has-a" della composizione è espressa usando un semplice riferimento, o talvolta una collezione. Qui l'hashmap è un metodo indiretto. Non puoi raggiungere l'ornamento se non hai l'hashmap. Considerando che nella composizione è possibile effettuare questa navigazione. Quindi, preferisco chiamare questi metadati un ornamento piuttosto che una composizione, ma sono sicuramente correlati. FWIW, l'ornamento (IMHO) si compone con i dati, ma non viceversa.
Erik Eidt,

@Jack, re: il mio ultimo FWIW, mi sono appena reso conto che quando si utilizza la hashmap debole normalmente non si inserisce un riferimento dai metadati che adornano l'oggetto all'altro a causa del mantenimento della memoria (o se si desidera che l'ha-a in quel direzione, dovrebbe essere un riferimento debole). Quindi, in genere il client hashmap debole lavora con due oggetti che sono effettivamente accoppiati tra loro ma non sono tecnicamente in composizione tra loro.
Erik Eidt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.