Jaka jest różnica między Google ImmutableList i kolekcje.unmodifiableList ()?

Z immutablelist javadocs:

Kolekcje.unmodifiableList (jap.util.Lista), który jest poglądem na odrębną kolekcja, która wciąż może się zmieniać, instancja ImmutableList zawiera swoje własne prywatne dane i nigdy nie będzie zmiana. ImmutableList jest wygodny dla publicznych statycznych list końcowych ("stałe listy"), a także pozwala na łatwo zrobić "kopię obronną" z lista przekazana klasie przez a dzwoniący.

Czy to znaczy że:

  1. Jeśli mam ImmutableList obiektów wymiaru (na przykład), to nie mogę zmienić w nim żadnego obiektu wymiaru?
  2. i jeśli mam Kolekcje.unmodifiableList (lista) obiektów Dimension wtedy nie mogę tylko dodać lub usunąć żadnego obiektu, ale mogę je zmienić(na przykład wywołać metodę setDimension (width, height))?
Author: gpampara, 2010-02-02

5 answers

Nie, niezmienność jest stosowana tylko do ilości i odniesień obiektów w Collection i nie odnosi się do zmienności obiektów umieszczonych w Collection.

To, co niezmienna lista zyskuje w porównaniu ze standardowym JDK Collections.unmodifiableList, to to, że używając ImmutableList masz gwarancję, że odwołane obiekty, ich kolejność i rozmiar listy nie mogą się zmienić z żadnego źródła. Z Collections.unmodifiableList jeśli coś innego ma odniesienie do listy bazowej, kod ten może zmodyfikować listę, nawet jeśli masz odniesienie do niezmodyfikowanej listy.

Jeśli jednak chcesz prawdziwej niezmienności, musisz wypełnić listę niezmiennymi obiektami.

 55
Author: Yishai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-12 04:26:09

Użycie Collections.unmodifiableList tworzy otoczkę wokół listy. jeśli lista bazowa ulegnie zmianie, nie zmieni się również Widok Twojej niezmodyfikowanej listy.

Jak mówi dokumentacja, Kod Google tworzy kopię. Jest to droższe obliczenie i zużywa więcej pamięci, ale jeśli ktoś zmieni oryginalną listę, nie może wpłynąć na ImmutableList.

Żadna z nich nie uniemożliwi zmiany obiektu na liście, jego pól, pól pól itp.

 19
Author: z5h,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-02 16:45:07

ImmutableList jest podobny do Collections.unmodifiableList( new ArrayList( list ) ). Zauważ, że nowo utworzona ArrayList jest , a nie przypisana do pola lub zmiennej.

 7
Author: KitsuneYMG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-02 16:50:01
  1. nie, poszczególne obiekty nadal mogą być modyfikowane. Zbiór przechowuje tylko odniesienia do zawartych obiektów, a nie pełną kopię każdego obiektu.
  2. możesz zmodyfikować listę, modyfikując kolekcję nadrzędną, którą nazwałeś kolekcjami.unmodifiableList (lista) on. Ale tak, możesz użyć setDimension, aby zmienić przechowywany element listy.
 3
Author: BobMcGee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-02 16:45:45

Możesz również rzucić okiem na to pytanie (Jaka jest różnica między Collections.unmodifiableSet() a ImmutableSet guawy).

 0
Author: Bartek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:46