在构造函数中初始化arrayList或map是好的做法吗?

时间:2019-08-08 12:24:05

标签: java

为了避免在访问ArrayList时出现空指针异常,建议在构造函数中初始化列表或map集合

public class ItemsDetail{
    private List<String> items;

    public ItemsDetail() {
        this.items = new ArrayList<>();
    }

}

1 个答案:

答案 0 :(得分:0)

这种方法没有错。

当然,除了在构造函数中初始化List之外,您还可以在声明实例变量时对其进行初始化:

private List<String> items = new ArrayList<>();

在构造器中不初始化List实例变量的唯一情况是,如果要创建ItemsDetail类的大量实例,并且对于大多数情况其中您永远不会访问items变量。

在这种情况下,创建多个您永远不会使用的ArrayList是多余的。可以通过在访问ArrayList之前对其进行初始化来进行优化,并仅在必要时对其进行初始化(延迟初始化)。

当然,除非您发现程序太慢并且这种优化有助于提高其性能,否则无需进行此类优化。

某些JDK类使用这种惰性初始化方法。例如,当您编写new ArrayList<>()时,尚未分配支持List的数组。而是将一个空数组分配给实例变量:

public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

这样可以节省新数组的创建(以防您永远不会在ArrayList中添加元素),并且还避免了NullPointerException的危险(以及对null的需求)检查),方法是将预定义的空数组实例分配给elementData变量。

考虑一下,这种JDK优化减少了您在自定义类中使用类似优化的动机,因为它使新ArrayList的实例化操作的扩展性较小。