2012-01-25 13 views
5

mam klasę, która jest niezmiennaniezmienność klasy, gdy zmienna występuje jako przykład ArrayList

Załóżmy, że jest metoda o cechach gettera dla zmiennej składowej typu ArrayList. W takim przypadku, gdy otrzymam odwołanie do tej zmiennej, mogę dodać lub usunąć z niej element. W tym przypadku wydaje się, że niezmienność zostaje naruszona.

Czy ktoś może wyjaśnić tę koncepcję w szczegółach?

+2

Zobacz http://stackoverflow.com/questions/8892350/immutable-vs-unmodifiable-collection – Zaki

+1

Zobacz także "Efektywna Java" Joshua Blocha, pozycja 24: Wykonuj defensywne kopie w razie potrzeby. Rozdział jest dostępny online [tutaj] (http://www.informit.com/articles/article.aspx?p=31551&seqNum=2) – mike9322

+0

Jeśli klasa ma być całkowicie niezmienna, zapisz odniesienie do listy _in twoja klasa_ (po kopiowaniu) jako instancja 'UnmodifiableList'. Nie potrzeba żadnych (dodatkowych) defensywnych kopii, a to zapobiega modyfikacji twojej klasy podczas konserwacji. –

Odpowiedz

3

Naprawdę masz rację. Niezmienność jest naruszona.

Aby uczynić klasę niezmienną, należy się upewnić, że wszystkie jej moduły pobierają bezpieczne kopie każdej klasy, której stan mógłby się zmienić.

3

Nie należy podawać zmiennej typu ArrayList. Zapewnić tylko List i upewnij się, że rodzicielka robi jeden następny:

  1. zwraca kopię listy
  2. lub zwraca niemodyfikowalne z wykazu

lub obu.

+1

Zwracanie obu kopii listy, która jest również niemożliwa do przekształcenia, nie jest konieczne –

0

jeśli utworzysz nową instancję tego zmienionego obiektu typu X, wówczas instancja X zostanie uznana za niezmienną. Łatwiej zrozumieć, jeśli bierzesz pod uwagę swoją ArrayList. Masz metody, aby zmienić tę listę. Każda zmienna metoda tworzy kopię tej listy i dodaje/usuwa/aktualizuje nową kopię i zwraca ją z powrotem.

Powiązane problemy