3

ArrayList属性を持つドメインクラスがあるとします。このタイプのインスタンスのゲッターとセッターを作成するときのベストプラクティスは何ですか(変更されないようにするため)?

4

8 に答える 8

6
public List getList() {
  return Collections.unmodifiableList(list);
}
于 2011-01-19T16:02:53.213 に答える
2

Collection.unmodifiableList()次のメソッドを使用して変更できないリストを返します。

コレクション-Collection.unmodizableList()

于 2011-01-19T16:01:44.087 に答える
1

Collections.unmodizableList()を使用できます。他の主要なコレクションタイプと同等のものがあります。

于 2011-01-19T16:04:22.457 に答える
1

lwellerの応答は、ほとんどの場合私が行うことですが、それはUnsupportOperationExceptionあなたが扱いたくないかもしれないものを投げます。その場合、のような複合クラスを宣言することを検討することをお勧めします。これには、選択しUnmodifiableListたを含みList、リストを変更するメソッドを除く、サポートするすべてのメソッドを公開します。これは当然のことながら、インターフェイスとタイプ互換ではなくなりCollectionます。

于 2011-01-19T16:16:12.380 に答える
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.

リストの要素が変更可能である場合は、それらについても何かを実行する必要があることに注意してください。

于 2011-01-19T17:09:49.590 に答える
1

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

public List getList() {
    ArrayList copy = new ArrayList(this.list);
    return Collections.unmodifiableList(copy);
}
于 2011-01-19T17:14:42.460 に答える
1

命名規則があります

listXXX(); 

読み取り専用リストを提供します。適切なアクセス修飾子を持つものに加えて、セッター/ゲッターが存在する可能性があります。

于 2011-01-19T17:39:51.103 に答える
1

guavaImmutableListクラスを使用します。次に、ゲッターは次のフォームに従う必要があります。

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

Collections.unmodizableListに対するguavaの利点は、コレクションがメソッドシグネチャで不変であることをクライアントに明らかにするため、人々が誤ってコレクションに何かを追加しようとする可能性がほとんどないことです。

于 2011-01-19T18:25:36.707 に答える