2012-11-18 3 views
5

突然変異がもはや必要でない時点で、JavaのListインタフェースのオブジェクトを不変の同等物に変換するとよいでしょう。つまり、クライアントは、freezeメソッドを呼び出して、リストを不変にすることができます。すぐに私には、深いコピーのメモリ費用なしでスレッドセーフです。 (編集:すべてのスレッドで使用する1つの余分な不変コピーが手頃であれば人は正しいでしょう)Javaリストの可変性を無効にする

このような機能を提供するサードパーティのインターフェイスまたはクラスはありますか?

+1

これらのいずれかを意味しますか? http://download.oracle.com/javase/6/docs/api/java/util/Collections.html?is-external=true#unmodifiableList(java.util.List)。独自のリストを(戦略として)ビルドすることができます。フリーズメソッドが呼び出されると、不変リストの内部リストが変更されます。 – Augusto

答えて

1

CopyOnWriteArrayListを使用してください。リストではなく、根本的な配列を変更することで、新しい配列が作成され、古い配列は破棄され、修正さ とき

CopyOnWriteArrayListとはことを除いて、多くのArrayListクラスのように振る舞います。この つまり内部 は不変であり、従って がオン、同期のいずれかを必要とすることなくトラバースするために使用することができる基礎となるCopyOnWriteArrayListとオブジェクトの配列への参照を保持している発信者がイテレータを取得し(すなわち、copyOnWriteArrayListRef.iterator())リストcopyOnWriteArrayListRefまたは に移動する前にcopyOnWriteArrayListRefリストをリストアする必要があります(同時変更のリスクはありません)。 もパフォーマンスが向上します。

3

Guavaライブラリの一部としてImmutableListクラスがあります。 copyOfメソッドを使用して、既存のIterableからImmutableListを作成することができます。

List<String> immutableList = ImmutableList.copyOf(list);

1

Collections.unmodifiableListで使用して直接クライアントがまだ元の変更可能なリストへの参照を持っている場合は十分ではありません。

私はすべてのメソッドのそれへの呼び出しを、元の変更可能なリスト(デリゲート)への内部リファレンスを持っているし、転送します委任リストの実装を作成します。このようなコードを手書きで書くのはPITAですが、Eclipseなどは自動的に生成することができます。

はその後freezeメソッドを呼び出すときに、私は、将来の方法のすべてが唯一unmodifableビューを介して、元のデリゲートに行くFreezingListに呼び出すことが保証されCollections.unmodifiableListと元のリストをラップします。

以下のコンストラクタを変更して元のリストを渡す代わりに(クライアントに元々変更可能なリストへの参照を残すことができます)、内部的にリストをインスタンス化します例えばArrayList)。

public class FreezingList<E> implements List<E> { 

    // the original list you delegate to (the delegate) 
    private List<E> list; 

    private boolean frozen = false; 

    public FreezingList(List<E> list) { 
     this.list = list; 
    } 

    public void freeze() { 
     if (!frozen) { 
      list = Collections.unmodifiableList(list); 
      frozen = true; 
     } 
    } 

    // all the delegating methods follow: 
    public int size() { 
     return list.size(); 
    } 

    public E get(int index) { 
     return list.get(index); 
    } 
    // etc. etc. 
} 
関連する問題