web-dev-qa-db-ja.com

googleのImmutableListとCollections.unmodifiableList()の違いは何ですか?

ImmutableList javadocsから:

変更可能な個別のコレクションのビューであるCollections.unmodifiableList(Java.util.List)とは異なり、ImmutableListのインスタンスは独自のプライベートデータを含み、変更されることはありません。 ImmutableListは、公開の静的最終リスト(「定数リスト」)に便利であり、呼び出し元からクラスに提供されたリストの「防御コピー」を簡単に作成することもできます。

それはそれを意味しますか:

  1. (たとえば)DimensionオブジェクトのImmutableListがある場合、その中のDimensionオブジェクトを変更できませんか?
  2. dimensionオブジェクトのCollections.unmodifiableList(リスト)がある場合、オブジェクトを追加または削除できるだけでなく、それらを変更できます(たとえば、setDimension(width、height)メソッドを呼び出します)?
53
Roman

いいえ、不変性はコレクション内のオブジェクトの量と参照にのみ適用され、コレクションに配置したオブジェクトの可変性には対応していません。

Immutableリストが標準のJDK Collections.unmodifiableListよりも優れている点は、ImmutableListを使用することにより、参照されるオブジェクト、その順序、およびリストのサイズがどのソースからも変更できないことが保証されることです。 Collections.unmodifiableListを使用すると、基になるリストへの参照が他にある場合、変更不可能なリストへの参照があっても、そのコードはリストを変更できます。

ただし、真の不変性が必要な場合は、リストを不変オブジェクトで埋める必要があります。

53
Yishai

Collections.unmodifiableListを使用すると、リストのラッパーが作成されます。基になるリストが変更されると、unmodifiableListのビューも変更されます。

ドキュメントにあるように、Googleのコードはコピーを作成します。これはより高価な計算であり、より多くのメモリを消費しますが、誰かが元のリストを変更した場合、ImmutableListに影響を与えることはできません。

これらのどちらも、リスト内のオブジェクト、そのフィールド、またはフィールドのフィールドなどを変更することを妨げません。

17
z5h

ImmutableListCollections.unmodifiableList( new ArrayList( list ) )に似ています。新しく作成されたArrayListnotであり、フィールドまたは変数に割り当てられていることに注意してください。

6
KitsuneYMG
  1. いいえ、含まれている個々のオブジェクトは引き続き変更できます。コレクションは実際には、すべてのオブジェクトの完全なコピーではなく、含まれるオブジェクトへのreferencesのみを格納します。
  2. Collections.unmodifiableList(list)を呼び出した親コレクションを変更することにより、リストを変更できます。しかし、はい。setDimensionを使用して、格納されているリスト要素を変更できます。
3
BobMcGee

この質問 もご覧ください(Collections.unmodifiableSet()ImmutableSetの違いは何ですか)。

0
Bartek