ArrayList属性を持つドメインクラスがあるとします。このタイプのインスタンスのゲッターとセッターを作成するときのベストプラクティスは何ですか(変更されないようにするため)?
8 に答える
public List getList() {
return Collections.unmodifiableList(list);
}
Collection.unmodifiableList()
次のメソッドを使用して変更できないリストを返します。
Collections.unmodizableList()を使用できます。他の主要なコレクションタイプと同等のものがあります。
lwellerの応答は、ほとんどの場合私が行うことですが、それはUnsupportOperationException
あなたが扱いたくないかもしれないものを投げます。その場合、のような複合クラスを宣言することを検討することをお勧めします。これには、選択しUnmodifiableList
たを含みList
、リストを変更するメソッドを除く、サポートするすべてのメソッドを公開します。これは当然のことながら、インターフェイスとタイプ互換ではなくなりCollection
ます。
おそらくベストプラクティスは、リストで動作するコードをドメインクラスに移動することです。ドメインに適した方法でシーケンスを表すドメインクラスを追加する可能性があります。
リストを公開したい場合は、次の選択肢があります。
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.
リストの要素が変更可能である場合は、それらについても何かを実行する必要があることに注意してください。
リストの不変のスナップショットを作成することも検討してください。
public List getList() {
ArrayList copy = new ArrayList(this.list);
return Collections.unmodifiableList(copy);
}
命名規則があります
listXXX();
読み取り専用リストを提供します。適切なアクセス修飾子を持つものに加えて、セッター/ゲッターが存在する可能性があります。
guavaImmutableListクラスを使用します。次に、ゲッターは次のフォームに従う必要があります。
public ImmutableList<T> getMyList() {
ImmutableList.copyOf(myList);
}
Collections.unmodizableListに対するguavaの利点は、コレクションがメソッドシグネチャで不変であることをクライアントに明らかにするため、人々が誤ってコレクションに何かを追加しようとする可能性がほとんどないことです。