在构造函数或字段声明中初始化列表

2022-09-02 04:21:03

我想知道初始化像ArrayList这样的对象是否有区别<>字段声明或构造函数中的东西。

内存使用率,性能或类似的东西是否存在差异,或者是否完全相同?

选项 1:

class MyClass {
     private List<String> strings = new ArrayList<String>();
}

选项 2:

class MyClass {
    private List<String> strings;
    public MyClass() {
        strings = new ArrayList<String>();
    }
}

这可能是一个愚蠢的问题,或者是一个非常基本的问题,但我喜欢从一开始就构建,我喜欢理解我所看到的一切。


答案 1

有一个区别:初始化发生时。首先初始化字段,然后启动构造函数。

在简单示例中,没有实际区别,但如果另一个字段依赖于 List 字段进行初始化,则构造函数版本将使用 NPE 爆炸。

考虑:

 private List<String> strings = Arrays.asList("foo", "bar");
 private String stringsDescription = strings.toString();

如果将 的初始化移动到构造函数,则 的初始化将使用 NPE 爆炸。stringsstringsDescription


答案 2

看看这个 默认构造函数与内联字段初始化

还有其他方法可以初始化值:https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

恕我直言,在默认构造函数中初始化风险更大一些,除非您确定这是您唯一拥有的构造函数。如果有多个,则需要调用始终默认(良好做法)或复制初始化代码。