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



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

内存使用率、性能或类似方面是否存在差异,或者完全相同?

选项1:

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

选项2:

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

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

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

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

考虑:

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

如果将strings的初始化移动到构造函数,则stringsDescription的初始化将以NPE爆炸。

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

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

IMHO,在默认构造函数中初始化会有一点风险,除非你确定这是你唯一的构造函数。如果有多个,则需要调用"始终默认"(良好做法)或复制初始化代码。

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

您将不会看到内存、CPU或任何其他方面的性能差异。

当您将arrayList声明为静态变量时,会出现另一个差异,这样就可以从其他类访问它,而无需实例化持有它的类。在该设置中,您需要在声明时初始化,而不是在构造函数中初始化。考虑以下给出NullPointerException的示例:

import java.util.ArrayList;
public class Dogs {
    public static ArrayList<Dog> dogList;
    public Dogs(){
        dogList = new ArrayList<>();
    }
}
class Dog {
    String breed;
    public Dog(String breed){
        this.breed = breed;
    }
    public static void main(String[] args) {
        Dog dog1 = new Dog("pug");
        Dogs.dogList.add(dog1);
    }
}

最新更新