在构造函数或字段声明中初始化列表
问题描述:
我想知道在初始化对象如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爆炸。