Ho deciso di scrivere un elenco collegato singolarmente e ho avuto il piano per rendere immutabile la struttura del nodo collegato interno.
Mi sono imbattuto in un intoppo però. Supponiamo di avere i seguenti nodi collegati (dalle add
operazioni precedenti ):
1 -> 2 -> 3 -> 4
e dire che voglio aggiungere a 5
.
Per fare ciò, poiché il nodo 4
è immutabile, devo creare una nuova copia di 4
, ma sostituire il suo next
campo con un nuovo nodo contenente un 5
. Il problema è ora, 3
si riferisce al vecchio 4
; quello senza l'aggiunta 5
. Ora devo copiare 3
e sostituire il suo next
campo per fare riferimento alla 4
copia, ma ora 2
fa riferimento al vecchio3
...
O in altre parole, per fare un'appendice, sembra che l'intero elenco debba essere copiato.
Le mie domande:
Il mio pensiero è corretto? C'è un modo per fare un'appendice senza copiare l'intera struttura?
Apparentemente "Java efficace" contiene la raccomandazione:
Le lezioni dovrebbero essere immutabili a meno che non ci siano ottime ragioni per renderle mutabili ...
È un buon caso di mutabilità?
Non penso che questo sia un duplicato della risposta suggerita poiché non sto parlando dell'elenco stesso; che ovviamente deve essere mutabile per conformarsi all'interfaccia (senza fare qualcosa come mantenere la nuova lista internamente e recuperarla tramite un getter. A pensarci bene, anche se ciò richiederebbe qualche mutazione; sarebbe solo ridotto al minimo). Sto parlando se gli interni dell'elenco devono essere immutabili.
CopyOnWritexxx
classi incredibilmente costose utilizzate per il multi-threading. Nessuno si aspetta che le collezioni siano davvero immutabili (anche se crea alcune stranezze)