在声明中实例化收集字段是一种好习惯吗?例如:
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)
答案 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?
答案 3 :(得分:0)
使用您显示的特定代码,setList()
可以设置null
值,因此您无法删除空检查。但是我建议您将setter更改为1)拒绝空值,或2)设置Collections.emptyList()
而不是null,或3)设置新的ArrayList
或LinkedList
而不是{{1 }}。
null值总是很难处理,而且对于集合来说情况更糟。许多最佳实践建议禁止使用null集合。我非常同意。
更改此类行为意味着您需要查看null
的所有呼叫网站,并检查此类更改是否会破坏它。如果是,则需要更改解决方案或调整客户端代码。