Esiste una situazione in cui sarebbe meglio utilizzare riferimenti deboli anziché semplici composizioni?

10

Anche se i documenti Java specificano, tali riferimenti deboli sono principalmente per i mapping canonicalizing, troverai molti , molti , molti persone su Internet affermano che WeakHashMap è perfetto per archiviare i metadati dell'oggetto durante la sua vita. Tuttavia, nessuno si preoccupa di rendere un esempio E appropriato comprensibile

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

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

    
posta Leprechaun 07.02.2017 - 22:57
fonte

1 risposta

13

Diciamo che ho bisogno di associare alcuni metadati con 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 tracciare qualche stato per ciascuno di questi oggetti dati, vale a dire quelli che ho visto prima e potrebbe vedere di nuovo. Chiamerò questi metadati come un ornamento, che a volte è un termine usato per questo concetto.

La semplice composizione consente una facile ricerca dall'oggetto adorning (quello con i metadati) all'altro oggetto (quello con i dati), con la presunzione che dal momento che controllo la progettazione dell'oggetto dei metadati, posso inserire un riferimento direttamente a l'oggetto dati.

Tuttavia, a meno che non si controlli il progetto dell'oggetto dati e possa cambiarlo, 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 si può nemmeno individuare l'elemento associato ai metadati dato un oggetto (dati).

Oltre al problema della ricerca nella direzione che va dall'oggetto per trovare i suoi metadati che ornano, c'è 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 è una perdita di memoria.

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

Si noti inoltre che una hashmap di referenziazione debole consente non solo i valori (metadata) da recuperare (gc'ed), ma anche i (dati) chiavi da recuperare (gc'ed), poiché se le chiavi fossero conservate ciò sarebbe anche una perdita di memoria, e inoltre, i valori non potrebbero mai essere rilasciati neanche.

    
risposta data 08.02.2017 - 00:21
fonte

Leggi altre domande sui tag