Decidí escribir una lista vinculada individualmente y tenía el plan en marcha para hacer que la estructura del nodo interno vinculado fuera inmutable.
Sin embargo, me encontré con un inconveniente. Digamos que tengo los siguientes nodos vinculados (de add
operaciones anteriores ):
1 -> 2 -> 3 -> 4
y decir que quiero agregar a 5
.
Para hacer esto, dado que el nodo 4
es inmutable, necesito crear una nueva copia de 4
, pero reemplazar su next
campo con un nuevo nodo que contenga un 5
. El problema ahora 3
es hacer referencia a lo viejo 4
; el que no tiene el anexo 5
. Ahora necesito copiar 3
y reemplazar su next
campo para hacer referencia a la 4
copia, pero ahora 2
hace referencia al viejo 3
...
O, en otras palabras, para hacer un apéndice, parece que se necesita copiar toda la lista.
Mis preguntas:
¿Es correcto mi pensamiento? ¿Hay alguna forma de hacer un anexo sin copiar toda la estructura?
Aparentemente, "Java efectivo" contiene la recomendación:
Las clases deben ser inmutables a menos que haya una muy buena razón para hacerlas mutables ...
¿Es este un buen caso para la mutabilidad?
No creo que este sea un duplicado de la respuesta sugerida ya que no estoy hablando de la lista en sí; eso obviamente tiene que ser mutable para ajustarse a la interfaz (sin hacer algo como mantener la nueva lista internamente y recuperarla a través de un getter. Sin embargo, pensándolo bien, incluso eso requeriría algo de mutación; simplemente se mantendría al mínimo). Estoy hablando de si las partes internas de la lista deben ser inmutables o no.
CopyOnWritexxx
clases increíblemente caras que se usan para subprocesos múltiples. Nadie espera que las colecciones sean realmente inmutables (aunque crea algunas peculiaridades)