57

ImmutableList javadocs から:

Collections.unmodifiableList(java.util.List) は変更可能な別のコレクションのビューですが、ImmutableList のインスタンスには独自のプライベート データが含まれており、変更されることはありません。ImmutableList は public static final リスト (「定数リスト」) に便利であり、呼び出し元によってクラスに提供されたリストの「防御コピー」を簡単に作成することもできます。

それは次のことを意味しますか?

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

5 に答える 5

57

いいえ、不変性は 内のオブジェクトの量と参照にのみ適用され、 にCollection配置したオブジェクトの可変性には対処しませんCollection

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

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

于 2010-02-02T16:43:44.493 に答える
19

UsingCollections.unmodifiableListは、リストのラッパーを作成します。基になるリストが変更された場合、unmodifiableList のビューも変更されます。

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

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

于 2010-02-02T16:45:07.620 に答える
7

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

于 2010-02-02T16:50:01.277 に答える
3
  1. いいえ、含まれている個々のオブジェクトは引き続き変更できます。コレクションは実際には、すべてのオブジェクトの完全なコピーではなく、含まれているオブジェクトへの参照のみを格納しています。
  2. Collections.unmodifiableList(list) を呼び出した親コレクションを変更することで、リストを変更できます。しかし、はい、setDimension を使用して、格納されているリスト要素を変更できます。
于 2010-02-02T16:45:45.317 に答える