0

私が理解している不変コレクションの欠陥が正しいかどうかわからないので、この回答にそれらをリストします。誰かがここで私を訂正してくれることを願っています。

a):Collections.unmodizableXXX()と比較すると、ImmutableXXX.copyOf()はソースコレクション機能を失います。たとえば、linkedListがImmutableList.copyOf()に入れられると、ImmutableListはリンクされなくなります。ツリーベースのコレクションと同じです。

b):人々は、Collections.unmodizableXXXがソースコレクションの同じ参照を使用していると考えているため、ソースコレクションが変更されると、Collections.unmodizableXXXも変更されます。しかし、私の解決策は、ソースコレクションをImmutableXXX.copyOf()に渡される一時コレクションにラップすることです。以下のコードを参照してください。

List<String> l = new ArrayList<String>();
List<String>  unmodifiableList = Collections.unmodifiableList(l);
ImmutableList<String> immutableList= ImmutableList.copyOf(l);
l.add("a");//unmodifiableList is also added "a", immutableList not.

/*My solution as follows:
So unmodifiableList2 is also immutable as ImmutableList.copyOf(l) does*/
List<String> unmodifiableList2= Collections.unmodifiableList(new ArrayList(l));

イミュータブルコレクションについてどう思いますか?ありがとう!

4

3 に答える 3

21

あなたが言及したことは「欠陥」ではありません。

a)ImmutableList anがリンクリストでなくなったことはまったく問題ではありません。配列ベースのリストに対するリンクリストの唯一の利点は、要素の追加と削除(主に削除)です。不変リストに追加したり、リストから削除したりすることはできないため、高速ランダムアクセスとメモリ効率の点で配列ベースの方が適しています。

のようなものについてTreeSetは、考慮すべきいくつかのポイントがあります。

  1. 法線ImmutableSetは、与えられた要素の反復順序を保持します。したがって、TreeSetを使用ImmutableSet.copyOfして不変のコピーを作成する場合、コピーされた要素は元の要素と同じ順序になります。
  2. ImmutableSortedSetTreeSetは、要素の自然な順序付けとComparator同じように不変の同等物であり、使用TreeSetします。

b)List Guavaを使用せずにたまたま不変のを作成できるという事実は何も変わりません。Guavaの不変のコレクションは、不変性を念頭に置いて特別に設計されており、そのために次のようなさまざまな利点があります(ただしこれらに限定されません)。

  • 前回の質問への回答で述べたように、それらの不変性がタイプレベルで保証されているという事実。メソッドがタイプの何かを返すときImmutableSet、呼び出し元はセットがそれらで変更できないことを知っています。を返すだけの場合はそうではありませんSet
  • 空の場合のシングルトンや1要素の場合の特別なクラスを含むメモリの最適化。
  • ImmutableSet.copyOf入力がすでに同じタイプの不変インスタンスである場合など、実際には何もコピーしません。
  • 不変のコレクションを簡単に作成できるようにするメソッド/ビルダー。
于 2011-04-11T03:23:09.780 に答える
4

不変のコレクションが必要な理由

  • 並行プログラミングを劇的に簡素化します。考えてみてください。適切なマルチスレッドプログラミングを書くのが難しいのはなぜですか。特定のリソース(この場合はリスト)へのスレッドアクセスを同期するのは難しいためです。
于 2011-04-11T03:13:48.613 に答える
3

ColinDとAmirはあなたの特定の質問に直接答えましたが、GTUG-Java用のGoogleコレクションライブラリの使用( 1/2)-Kevin Bourrillion(Guavaのリード開発者)による不変のコレクションに関するプレゼンテーションもご覧ください。不変のコレクションの利点。

プレゼンテーションは2年前のもので、「Googleコレクション」(現在はGuavaのサブパート)に焦点を当てていますが、これは非常に興味深いプレゼンテーションです。GoogleコレクションAPIは当時ベータ版であったため、プレゼンテーション以降、APIは少し変更されている可能性がありますが、ほとんどの概念は同じままでした。

于 2011-04-11T06:03:03.333 に答える