Я вирішив написати список, пов'язаний окремо, і склався план зробити внутрішню пов'язану структуру вузла незмінною.
Хоча я наткнувся на корч Скажіть, у мене є такі пов'язані вузли (з попередніх addоперацій):
1 -> 2 -> 3 -> 4
і сказати, що я хочу додати 5.
Для цього, оскільки вузол 4є незмінним, мені потрібно створити нову копію 4, але замінити його nextполе новим вузлом, що містить a 5. Проблема зараз 3полягає в посиланні на старе 4; той, що не додається 5. Тепер мені потрібно скопіювати 3і замінити його nextполе для посилання на 4копію, але тепер 2посилається на старе 3...
Або іншими словами, щоб зробити додавання, весь список, здається, потрібно скопіювати.
Мої запитання:
Чи правильно моє мислення? Чи є спосіб зробити додавання, не копіюючи всю структуру?
Мабуть, "Ефективна Java" містить рекомендації:
Заняття повинні бути незмінними, якщо немає дуже вагомих причин зробити їх незмінними ...
Це хороший випадок для змінності?
Я не думаю, що це дублікат запропонованої відповіді, оскільки я не кажу про сам список; це, очевидно, повинно бути виправданим, щоб відповідати інтерфейсу (не роблячи щось на зразок збереження нового списку внутрішньо та вилучення його за допомогою геттера. Хоча, по-друге, навіть це потребує мутації; він просто зведений до мінімуму). Я говорю про те, чи повинні внутрішні переліки бути непорушними чи ні.

CopyOnWritexxxкласи, що використовуються для багатониткового нарізування. Ніхто не очікує, що колекції будуть непорушними (хоча це і створює деякі примхи)