2010-01-06 90 views
2

比方說,我有這樣的:這兩種初始化模式有區別嗎?

public class Whatever { 
    private ArrayList<String> myList = new ArrayList<String>(); 
    // more code goes here 
} 

還是讓我們說我有這樣的:

public class Whatever { 
    private ArrayList<String> myList = null; 

    public Whatever() { 
    myList = new ArrayList<String>(); 
    } 
} 

什麼的myList這兩個initialisations之間的區別?假設第一個變體是否是錯誤的?

+1

相關的說明,這是最好的事情: 私人列表 myList中=新的ArrayList () – sateesh 2010-01-06 11:39:13

+3

它更preferrable做:'私人最終名單 myList中=新的ArrayList ();' – Bombe 2010-01-06 12:05:20

回答

13

第一個變體將始終實例化數組列表,第二個變量將僅在調用默認構造函數時實例化。對於第二種解決方案的意義,您必須爲您添加的任何其他構造函數調用默認構造函數,例如

public class Whatever { 
    private final List<String> myList; 

    public Whatever() { 
    myList = new ArrayList<String>(); 
    } 

    public Whatever(String name) { 
    this(); 
    // Other stuff done 
    } 

    public Whatever(List<String> myList) { 
    this.myList = myList; 
    } 
} 

(第二)「懶惰」初始化方法可能會更好,如果你不經常使用的清單(例如,如果你在另一個構造一樣,直接在我的例子設置列表),並希望避免造成不必要的對象。 (編輯:我改變了ArrayList到一個接口,並將其設置爲最終的。這不是問題的一部分,但它是 - 如評論中所述 - 使用List集合的最佳方式)。

3

的JVM首先執行碼,如本(構造外):

public class Whatever { 
    private ArrayList<String> myList = new ArrayList<String>(); 
    // more code goes here 
} 

才把代碼,如下所示(在構造器):

public class Whatever { 
    private ArrayList<String> myList = null; 

    public Whatever() { 
    myList = new ArrayList<String>(); 
    } 
} 

所以,除非的順序執行對你來說很重要,我想@達夫的答案是正確的。

3

在這個特定的例子中,除了第一種形式更短以外沒有區別。但是,如果屬性初始化表達式(可能)拋出異常,則第二種形式允許您捕獲異常,或將它們聲明爲在構造函數簽名中拋出。

當然,如果您有多個構造函數,第二種形式允許您在每個構造函數中以不同方式初始化屬性......或者使用構造函數鏈來初始化相同的屬性......或者混合兩種初始化類型。

相關問題