2011-01-19 8 views

答えて

6
public List getList() { 
    return Collections.unmodifiableList(list); 
} 
+0

変更不可能なリストが説明されている場所を指していても、これを展開できますか? – Pureferret

1

私はほとんどの場合、私がやることですが、対処したくないかもしれないUnsupportOperationExceptionを投げます。この場合、のような複合クラスを宣言することをお勧めします。これにはListが含まれています。リストを変更するメソッドを除外したい場合は、サポートするすべてのメソッドを公開します。このことは、Collectionインターフェイスとの互換性がなくなりました。

1

おそらく、リスト上で動作するコードをドメインクラスに移動することをお勧めします。おそらく、ドメインに適した方法でシーケンスを表すドメインクラスを追加します。リストの要素が可変であれば、あなたもそれらについて何かをしたい場合があります

return Collections.unmodifiableList(new ArrayList<Thing>(things)); 
    // Bit big - shame there isn't a single method and class to do this. 

return new ArrayList<Thing>(things); 
    // Do you really want to see client code modifying the list? 

return Collections.unmodifiableList(things); 
    // Client may expecting a snapshot, modifications to the original will mess up. 

注:あなたがリストを公開するために必死であれば

は、次の選択があります。

1

また、リストの不変スナップショットを作成することを検討してください。

public List getList() { 
    ArrayList copy = new ArrayList(this.list); 
    return Collections.unmodifiableList(copy); 
} 
1

我々は

listXXX(); 

命名規則を持っているあなたに、読み取り専用のリストを与えます。 適切なアクセス修飾子に加えて、セッター/ゲッターがあるかもしれません。

1

guava ImmutableListクラスを使用してください。あなたのゲッターは、フォームに従ってください:

public ImmutableList<T> getMyList() { 
    ImmutableList.copyOf(myList); 
} 

Collections.unmodifiableList以上グアバの利点は、それがあなたのcolllectionは、メソッドのシグネチャでは不変であるクライアントに明らかになったので、誤って試みる人々の非常に少ないチャンスがあるということですコレクションに何かを追加する。

関連する問題