我应该在声明中实例化收集字段吗?

时间:2016-02-26 14:34:17

标签: java refactoring

在声明中实例化收集字段是一种好习惯吗?例如:

class A {
    private List<String> list = new ArrayList<>();

    public List<String> getList() {
        return list;  
    }

    public setList(List<String> list) {
        this.list = list;
    }
}

我需要它的原因是避免像这样检查null:

if (a.getList() != null)

4 个答案:

答案 0 :(得分:4)

最好避免在可能的情况下使用null值。您也可以创建字段final,因此您知道永远不会null有注释允许您跟踪该值不能为空。

private final List<String> list = new ArrayList<>();

@NotNull
public List<String> getList() {
    return list;  
}

如果你以后再这样做

if (a.getList() != null) // your IDE can tell you this is always true.

答案 1 :(得分:1)

意见各不相同,但在这种情况下,我绝对认为:空集合比可空的空集合更清晰,更纯粹。

在那里初始化也意味着您可以使字段final获得一些好处,但是您必须在setList()之后调用clear()和{{1}新项目。因此,单独可能没什么好处,但在其他情况下它有优势......

答案 2 :(得分:0)

我认为启动对象的更好地方是班级的构造函数 全面的解释:Should I instantiate instance variables on declaration or in the constructor?

Instantiating object in a constructor

答案 3 :(得分:0)

使用您显示的特定代码,setList()可以设置null值,因此您无法删除空检查。但是我建议您将setter更改为1)拒绝空值,或2)设置Collections.emptyList()而不是null,或3)设置新的ArrayListLinkedList而不是{{1 }}。 null值总是很难处理,而且对于集合来说情况更糟。许多最佳实践建议禁止使用null集合。我非常同意。

更改此类行为意味着您需要查看null的所有呼叫网站,并检查此类更改是否会破坏它。如果是,则需要更改解决方案或调整客户端代码。