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

问题描述:

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

内存使用情况,性能或类似情况有差别还是完全相同?

选项1:

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

选项2:

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

这可能是一个愚蠢的问题,还是一个很基本的一个,但我喜欢从一开始建立,我想了解所有我看到的。

它本质上是一回事。在构造函数中执行它可以更好地控制它(例如,不同的构造函数可以做不同的事情),但最终的结果是相同的。

在内存,CPU或任何其他方式中,您将看不到任何性能差异。

看看这个Default constructor vs. inline field initialization

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

恕我直言,在默认的构造函数初始化的风险更高一点,除非你确信这是你唯一的构造方法。如果你有不止一个,你需要始终调用默认(良好做法)或复制初始化代码。

有差别:发生初始化。字段首先被初始化,然后构造函数触发。

在你的微不足道的例子中,没有实际的区别,但是如果另一个字段依赖于List字段进行初始化,那么构造函数版本将会以NPE爆炸。

考虑:

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

如果你感动的strings初始化到构造的stringsDescription初始化将与NPE爆炸。