web-dev-qa-db-ja.com

ソナー-コピーの保存-可変メンバーは直接保存または返すべきではありません

クラスにプライベートメンバーのリストがあります。ゲッターとセッターを使用して値を取得および設定しました。 SOnarはエラーをスローします-可変メンバーは直接保存または返すべきではありません。

たとえば、ABCとDEFは2つのクラスです。

class ABC{
private List<DEF> defList;
public List<DEF> getDefList() { return defList; }
public void setDefList(List<DEF> defList) { this.defList = defList; }

多くのグーグル検索を行った結果、ゲッターを次のように変更できることがわかりました。

public List<DEF> getDefList() { return new ArrayList<>(defList); }

同様にセッターを使用しようとすると、

public void setDefList(List<DEF> defList) { this.defList.addAll(defList); }

その後、変数が表示され始めます

'private field 'defList' is never assigned.

リスト(別のクラスのリスト)の場合の正しい方法を教えてください

注:Prasad KarunagodaとLeo Asoからの回答はどちらも機能します。両方を承認済みの回答としてマークできません。ここにメモがあります

5
pgman

ゲッターから返されるListに追加の制限(不変性)を追加しない方が良いと思います。これを行うと、たとえばListを使用するクライアントは、それをソートできなくなります。

だから、私の推奨するアプローチはこれです:

public class ABC {
  private List<DEF> defList = new ArrayList<>();

  public List<DEF> getDefList() {
    return new ArrayList<>(defList);
  }

  public void setDefList(List<DEF> defList) {
    if (defList == null)
        throw new IllegalArgumentException("Parameter defList is null");
    this.defList.clear();
    this.defList.addAll(defList);
  }
}

設計の観点から、ABCクラスのさらに優れたAPIは次のようになります。

public List<DEF> getDefList()
public void clearDefList()
public void addAllDefs(List<DEF> defs) // Or method name appendDefs
0