Postanowiłem napisać pojedynczo połączoną listę i miałem plan, aby wewnętrzna struktura połączonego węzła była niezmienna.
Wpadłem jednak na przeszkodę. Powiedz, że mam następujące połączone węzły (z poprzednich addoperacji):
1 -> 2 -> 3 -> 4
i powiedz, że chcę dołączyć 5.
Aby to zrobić, ponieważ węzeł 4jest niezmienny, muszę utworzyć nową kopię 4, ale zastąpić jej nextpole nowym węzłem zawierającym 5. Problem polega na tym, że 3odwołuje się do starego 4; ten bez dołączonego 5. Teraz muszę skopiować 3i zastąpić jego nextpole, aby odwołać się do 4kopii, ale teraz 2odwołuje się do starego 3...
Innymi słowy, aby zrobić dodatek, cała lista wydaje się wymagać skopiowania.
Moje pytania:
Czy moje myślenie jest prawidłowe? Czy jest jakiś sposób na wykonanie append bez kopiowania całej struktury?
Najwyraźniej „Skuteczna Java” zawiera zalecenie:
Klasy powinny być niezmienne, chyba że istnieje bardzo dobry powód, aby je modyfikować ...
Czy to dobry argument za zmiennością?
Nie sądzę, że jest to kopia sugerowanej odpowiedzi, ponieważ nie mówię o samej liście; to oczywiście musi być modyfikowalne, aby dostosować się do interfejsu (bez robienia czegoś takiego, jak utrzymywanie nowej listy wewnętrznie i pobieranie jej za pomocą gettera. Jednak przy drugiej przemyśleniu nawet to wymagałoby pewnej mutacji; byłoby to po prostu ograniczone do minimum). Mówię o tym, czy elementy wewnętrzne listy muszą być niezmienne.

CopyOnWritexxxklasy używane do wielowątkowości. Nikt nie spodziewa się, że kolekcje są niezmienne (chociaż powoduje to pewne dziwactwa)