【问题标题】:Initializing List in constructor or field declaration在构造函数或字段声明中初始化列表
【发布时间】:2016-02-22 07:30:02
【问题描述】:

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

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

选项一:

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

选项 2:

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

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

【问题讨论】:

    标签: java arrays initialization


    【解决方案1】:

    当您将 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);
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      考虑:

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

      如果您将 strings 的初始化移至构造函数,stringsDescription 的初始化将因 NPE 而爆炸。

      【讨论】:

        【解决方案3】:

        看看这个Default constructor vs. inline field initialization

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 2013-08-14
            • 2012-04-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多