Java:这些构造方法有什么区别

MrH*_*Hus 5 java constructor initialization

这两种初始化观察者ArrayList的方法有什么区别.或者任何其他类型的事情.一个比另一个快吗?或者我在这里错过了其他一些好处.

class Publisher implements Observerable
{
     private ArrayList observers = new ArrayList();
}

class Publisher implements Observerable
{
    private ArrayList observers; 

    public Publisher()
    {
        observers = new ArrayList();
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 13

他们是等同的.实际上,如果你编译这两个,你会看到它们生成完全相同的字节代码:

Publisher();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   new     #2; //class java/util/ArrayList
   8:   dup
   9:   invokespecial   #3; //Method java/util/ArrayList."<init>":()V
   12:  putfield        #4; //Field observers:Ljava/util/ArrayList;
   15:  return    
}
Run Code Online (Sandbox Code Playgroud)

鉴于它们是相同的代码,显然不会有任何速度差异:)

请注意,在C#中,它们并不完全相同 - 在C#中,初始化程序observers基础构造函数调用之前运行; 在Java中他们真的是一样的.

你使用的是品味问题.如果你有几个不同的构造函数,它们都以相同的方式初始化变量,那么使用第一个表单是有意义的.另一方面,如果你有几个构造函数试图让大多数构造函数调用一个"核心"构造函数来完成实际工作,那么通常是一个好主意.