Sonar - Храните копию - Изменяемые члены не должны храниться или возвращаться напрямую - PullRequest
0 голосов
/ 08 января 2019

У меня есть список, который является частным членом в моем классе. Я использовал getter и setter для получения и установки значений. SOnar выдает ошибку - изменяемые члены не должны храниться или возвращаться напрямую.

Например: ABC и DEF - это два класса.

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.

Могу ли я знать, как правильно делать, когда это список, (список другого класса)

Примечание: оба ответа от Прасада Карунагоды и Льва Асо работают. Я не могу отметить оба как принятый ответ. Так что с запиской здесь

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Я считаю, что лучше не добавлять дополнительные ограничения (неизменяемость) к 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);
  }
}

С точки зрения дизайна, еще лучший API для класса ABC будет:

public List<DEF> getDefList()
public void clearDefList()
public void addAllDefs(List<DEF> defs) // Or method name appendDefs
0 голосов
/ 08 января 2019

Предупреждение в том, что вы не указали в поле начальное значение. Вот как вы должны реализовать код для обеспечения неизменности, используя java.util.Collections.

class ABC {
    private List<DEF> defList = Collections.emptyList();

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

    public void setDefList(List<DEF> defList) {
        // defensively copy, then make immutable
        defList = new ArrayList<>(defList);
        this.defList = Collections.unmodifiableList(defList);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...