J'ai décidé d'écrire une liste à liaison unique et j'avais le plan pour rendre la structure de nœud liée interne immuable.
Je suis tombé sur un hic cependant. Disons que j'ai les nœuds liés suivants (des add
opérations précédentes ):
1 -> 2 -> 3 -> 4
et dire que je veux ajouter un 5
.
Pour ce faire, étant donné que le nœud 4
est immuable, je dois créer une nouvelle copie de 4
, mais remplacer son next
champ par un nouveau nœud contenant un 5
. Le problème est maintenant, 3
fait référence à l'ancien 4
; celui sans l'annexe 5
. Maintenant, je dois copier 3
et remplacer son next
champ pour référencer la 4
copie, mais fait maintenant 2
référence à l'ancien 3
...
Ou en d'autres termes, pour faire un ajout, la liste entière semble avoir besoin d'être copiée.
Mes questions:
Ma pensée est-elle correcte? Existe-t-il un moyen de faire un ajout sans copier toute la structure?
Apparemment, "Java efficace" contient la recommandation:
Les classes doivent être immuables à moins qu'il n'y ait une très bonne raison de les rendre mutables ...
Est-ce un bon cas de mutabilité?
Je ne pense pas que ce soit un double de la réponse suggérée car je ne parle pas de la liste elle-même; cela doit évidemment être modifiable pour se conformer à l'interface (sans faire quelque chose comme garder la nouvelle liste en interne et la récupérer via un getter. Je veux savoir si les éléments internes de la liste doivent être immuables.
CopyOnWritexxx
classes incroyablement coûteuses utilisées pour le multi-threading. Personne ne s'attend vraiment à ce que les collections soient immuables (bien que cela crée des bizarreries)