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