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 add
operacji):
1 -> 2 -> 3 -> 4
i powiedz, że chcę dołączyć 5
.
Aby to zrobić, ponieważ węzeł 4
jest niezmienny, muszę utworzyć nową kopię 4
, ale zastąpić jej next
pole nowym węzłem zawierającym 5
. Problem polega na tym, że 3
odwołuje się do starego 4
; ten bez dołączonego 5
. Teraz muszę skopiować 3
i zastąpić jego next
pole, aby odwołać się do 4
kopii, ale teraz 2
odwoł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.
CopyOnWritexxx
klasy używane do wielowątkowości. Nikt nie spodziewa się, że kolekcje są niezmienne (chociaż powoduje to pewne dziwactwa)