ImmutableList javadocsから:
変更可能な個別のコレクションのビューであるCollections.unmodifiableList(Java.util.List)とは異なり、ImmutableListのインスタンスは独自のプライベートデータを含み、変更されることはありません。 ImmutableListは、公開の静的最終リスト(「定数リスト」)に便利であり、呼び出し元からクラスに提供されたリストの「防御コピー」を簡単に作成することもできます。
それはそれを意味しますか:
いいえ、不変性はコレクション内のオブジェクトの量と参照にのみ適用され、コレクションに配置したオブジェクトの可変性には対応していません。
Immutableリストが標準のJDK Collections.unmodifiableListよりも優れている点は、ImmutableListを使用することにより、参照されるオブジェクト、その順序、およびリストのサイズがどのソースからも変更できないことが保証されることです。 Collections.unmodifiableListを使用すると、基になるリストへの参照が他にある場合、変更不可能なリストへの参照があっても、そのコードはリストを変更できます。
ただし、真の不変性が必要な場合は、リストを不変オブジェクトで埋める必要があります。
Collections.unmodifiableList
を使用すると、リストのラッパーが作成されます。基になるリストが変更されると、unmodifiableListのビューも変更されます。
ドキュメントにあるように、Googleのコードはコピーを作成します。これはより高価な計算であり、より多くのメモリを消費しますが、誰かが元のリストを変更した場合、ImmutableListに影響を与えることはできません。
これらのどちらも、リスト内のオブジェクト、そのフィールド、またはフィールドのフィールドなどを変更することを妨げません。
ImmutableList
はCollections.unmodifiableList( new ArrayList( list ) )
に似ています。新しく作成されたArrayList
はnotであり、フィールドまたは変数に割り当てられていることに注意してください。
この質問 もご覧ください(Collections.unmodifiableSet()
とImmutableSet
の違いは何ですか)。