Decidi escrever uma lista vinculada individualmente e tive o plano para tornar a estrutura interna do nó vinculado imutável.
Eu encontrei um obstáculo embora. Digamos que eu tenha os seguintes nós vinculados (de add
operações anteriores ):
1 -> 2 -> 3 -> 4
e diga que eu quero acrescentar a 5
.
Para fazer isso, como o nó 4
é imutável, preciso criar uma nova cópia de 4
, mas substituir seu next
campo por um novo nó contendo a 5
. O problema agora 3
é referenciar o antigo 4
; aquele sem o anexo 5
. Agora eu preciso copiar 3
e substituir seu next
campo para fazer referência à 4
cópia, mas agora 2
está fazendo referência ao antigo 3
...
Ou, em outras palavras, para anexar, parece que a lista inteira precisa ser copiada.
Minhas perguntas:
Meu pensamento está correto? Existe alguma maneira de fazer um acréscimo sem copiar toda a estrutura?
Aparentemente, "Java eficaz" contém a recomendação:
As aulas devem ser imutáveis, a menos que haja uma boa razão para torná-las mutáveis ...
Esse é um bom caso para mutabilidade?
Não acho que seja uma duplicata da resposta sugerida, pois não estou falando da lista em si; isso obviamente tem que ser mutável para se adaptar à interface (sem fazer algo como manter a nova lista internamente e recuperá-la por meio de um getter. Pensando bem, mesmo isso exigiria alguma mutação; seria apenas mantido no mínimo). Estou falando sobre se os internos da lista devem ou não ser imutáveis.
CopyOnWritexxx
classes incrivelmente caras usadas para multiencadeamento. Ninguém espera coleções para ser imutável realmente (embora não criar algumas peculiaridades)