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

Jan*_*sha 13 java arrays initialization

我想知道在初始化对象如ArrayList <>和字段声明或构造函数中的东西是否有区别.

内存使用,性能或类似内容是否存在差异,还是完全相同?

选项1:

class MyClass {
     private List<String> strings = new ArrayList<String>();
}
Run Code Online (Sandbox Code Playgroud)

选项2:

class MyClass {
    private List<String> strings;
    public MyClass() {
        strings = new ArrayList<String>();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Boh*_*ian 7

是有区别的:初始化发生.首先初始化字段,然后构造函数触发.

在你琐碎的例子中,没有实际的区别,但是如果另一个字段依赖于List字段进行初始化,那么构造函数版本会随着NPE而爆炸.

考虑:

 private List<String> strings = Arrays.asList("foo", "bar");
 private String stringsDescription = strings.toString();
Run Code Online (Sandbox Code Playgroud)

如果您将初始化移动strings到构造函数,初始化stringsDescription将与NPE一起爆炸.


Ger*_*Amy 5

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

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

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


Tim*_*m B 4

本质上是一样的。在构造函数中执行此操作可以对其进行更多控制(例如,不同的构造函数可以执行不同的操作),但最终结果是相同的。

无论哪种方式,您都不会发现内存、CPU 或其他任何东西的性能差异。