Java 我应该在声明中实例化集合字段吗?
在声明中实例化集合字段是一种好的做法吗?例如:Java 我应该在声明中实例化集合字段吗?,java,refactoring,Java,Refactoring,在声明中实例化集合字段是一种好的做法吗?例如: class A { private List<String> list = new ArrayList<>(); public List<String> getList() { return list; } public setList(List<String> list) { this.list = list; } }
class A {
private List<String> list = new ArrayList<>();
public List<String> getList() {
return list;
}
public setList(List<String> list) {
this.list = list;
}
}
最好尽可能避免使用
null
值。您还可以将字段设置为final,这样您就知道它永远不会为null
private final List<String> list = new ArrayList<>();
@NotNull
public List<String> getList() {
return list;
}
最好尽可能避免使用
null
值。您还可以将字段设置为final,这样您就知道它永远不会为null
private final List<String> list = new ArrayList<>();
@NotNull
public List<String> getList() {
return list;
}
观点各不相同,但在这种情况下,我肯定认为是的:空集合比可空集合和可空集合更清晰、更纯粹
在那里初始化还意味着可以将字段
设置为final
,这会带来一些好处,不过在这里,您必须将设置为setList()
而不是调用clear()
和addAll()
新项。因此,仅此一点可能没有多大好处,但在其他情况下,它也有好处……观点各异,但在这种情况下,我肯定会说是的:空集合比空集合和空集合更清晰、更纯净
在那里初始化还意味着可以将字段
设置为final
,这会带来一些好处,不过在这里,您必须将设置为setList()
而不是调用clear()
和addAll()
新项。因此,仅此一点可能没有多大好处,但在其他情况下,它也有好处…我认为启动对象的更好地方是类的构造函数。全面的解释:
我认为启动对象的更好地方是类的构造函数。
全面的解释:
对于您显示的特定代码,
setList()
可以设置null
值,因此您无法删除null检查。但是,我建议您将setter更改为1)拒绝空值,或2)设置Collections.emptyList()
而不是null,或3)设置新的ArrayList
或LinkedList
而不是null
。
空值总是很难处理,对于集合来说更是如此。许多最佳实践建议禁止空集合。我完全同意
更改这种行为意味着您需要查看
getList()
的所有调用站点,并检查这种更改不会破坏它。如果是,则需要更改解决方案或调整客户端代码。对于显示的特定代码,setList()
可以设置null
值,因此无法删除null检查。但是,我建议您将setter更改为1)拒绝空值,或2)设置Collections.emptyList()
而不是null,或3)设置新的ArrayList
或LinkedList
而不是null
。
空值总是很难处理,对于集合来说更是如此。许多最佳实践建议禁止空集合。我完全同意
更改这种行为意味着您需要查看
getList()
的所有调用站点,并检查这种更改不会破坏它。如果是这样,那么您需要更改解决方案或修改客户端代码。是否需要详细说明为什么这会更好?@Nfear请参考我看到的答案。因此,对于不使用arraylist的情况。可以避免初始化以节省内存。请详细说明为什么这样更好?@Nfear请参考我看到的答案。因此,对于不使用arraylist的情况。可以避免初始化以节省内存。
if (a.getList() != null) // your IDE can tell you this is always true.