声纳 - 存储副本 - 不应直接存储或返回可变成员

pgm*_*man 9 java arraylist mutable sonarqube

我有一个列表,它是我班上的私人成员。我使用 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; }
Run Code Online (Sandbox Code Playgroud)

经过大量的谷歌搜索和搜索,我了解到可以按如下方式更改 getter:

public List<DEF> getDefList() { return new ArrayList<>(defList); }
Run Code Online (Sandbox Code Playgroud)

当我尝试类似地使用 setter 时,

public void setDefList(List<DEF> defList) { this.defList.addAll(defList); }
Run Code Online (Sandbox Code Playgroud)

然后变量开始显示

'private field 'defList' is never assigned.
Run Code Online (Sandbox Code Playgroud)

我可以知道当它是一个列表时的正确方法吗(另一个类的列表)

注意:Prasad Karunagoda 和 Leo Aso 的答案都有效。我不能将两者都标记为已接受的答案。所以在这里做个笔记

Leo*_*Aso 8

警告是因为您没有为该字段提供初始值。这就是您应该如何实现代码以确保使用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);
    }
Run Code Online (Sandbox Code Playgroud)