it-swarm.com.de

Was ist der Unterschied zwischen der ImmutableList von Google und der Collections.unmodifiableList ()?

Aus ImmutableList javadocs:

Im Gegensatz zu Collections.unmodifiableList (Java.util.List), einer Ansicht einer separaten Sammlung, die sich noch ändern kann, enthält eine Instanz von ImmutableList ihre eigenen privaten Daten und wird sich nie ändern. ImmutableList ist praktisch für öffentliche statische Endlisten ("Konstantenlisten") und ermöglicht es Ihnen, auf einfache Weise eine "defensive Kopie" einer Liste zu erstellen, die ein Anrufer Ihrer Klasse zur Verfügung gestellt hat.

Bedeutet das, dass:

  1. wenn ich ImmutableList von Dimensionsobjekten habe (zum Beispiel), kann ich dann kein Dimensionsobjekt darin ändern?
  2. und wenn ich Collections.unmodifiableList (Liste) von Dimensionsobjekten habe, kann ich dann kein Objekt hinzufügen oder löschen, aber ich kann sie ändern (zum Beispiel setDimension (width, height) -Methode aufrufen)?
48
Roman

Nein, die Unveränderlichkeit wird nur auf die Menge und die Referenzen der Objekte in der Collection angewendet und bezieht sich nicht auf die Veränderlichkeit von Objekten, die Sie in die Collection einfügen.

Gegenüber der standardmäßigen JDK Collections.unmodifiableList gewinnt die unveränderliche Liste, dass durch die Verwendung von ImmutableList sichergestellt wird, dass die referenzierten Objekte, ihre Reihenfolge und die Größe der Liste von keiner Quelle geändert werden können. Wenn mit Collections.unmodifiableList etwas anderes auf die zugrunde liegende Liste verweist, kann dieser Code die Liste ändern, auch wenn Sie auf eine nicht veränderbare Liste verweisen.

Wenn Sie jedoch eine echte Unveränderlichkeit wünschen, müssen Sie die Liste mit unveränderlichen Objekten füllen.

53
Yishai

Mit Collections.unmodifiableList wird ein Wrapper um Ihre Liste erstellt. Wenn sich die zugrunde liegende Liste ändert, ändert sich auch die Ansicht Ihrer unmodifiableList.

Wie aus der Dokumentation hervorgeht, erstellt der Code von Google eine Kopie. Dies ist eine kostspieligere Berechnung und verbraucht mehr Speicher, aber wenn jemand die ursprüngliche Liste ändert, kann dies die ImmutableList nicht beeinflussen.

Keines dieser Elemente verhindert, dass Sie ein Objekt in einer Liste oder dessen Felder oder Felder von Feldern usw. ändern.

17
z5h

ImmutableList ähnelt Collections.unmodifiableList( new ArrayList( list ) ). Beachten Sie, dass die neu erstellte ArrayList not einem Feld oder einer Variablen zugeordnet ist.

6
KitsuneYMG
  1. Nein, die enthaltenen Einzelobjekte können noch geändert werden. Eine Sammlung speichert eigentlich nur Referenzen zu den enthaltenen Objekten, nicht eine vollständige Kopie jedes Objekts.
  2. Sie können die Liste ändern, indem Sie die übergeordnete Collection ändern, in der Sie Collections.unmodifiableList (list) genannt haben. Aber ja, Sie können setDimension verwenden, um ein gespeichertes Listenelement zu ändern. 
3
BobMcGee

Vielleicht möchten Sie auch einen Blick auf diese Frage werfen (Was ist der Unterschied zwischen Collections.unmodifiableSet() und ImmutableSet von Guava).

0
Bartek