建立 MyClass 物件並指定集合大小時,會建立兩個 ArrayList,其中一個瞬間成為垃圾。初始化器在所有建構函式之前執行,建構函式再建立第二個清單。編譯器產生的程式碼如下(你絕不會手寫):
public class MyClass
{
private ArrayList _coll;
MyClass() { _coll = new ArrayList(); }
MyClass(int size) { _coll = new ArrayList(); _coll = new ArrayList(size); }
}
將初始化放入建構函式的另一理由:促成例外捕捉。初始化器無法使用 try 區塊,建構時因成員變數產生的例外可能傳播出物件外部,你無法在類別內捕捉。應將初始化程式碼移入建構函式,以便捕捉例外並確保程式碼友善(原則 45)。
欄位初始化器是在忽略建構函式時確保成員變數正確初始化的最簡單方法。初始化器在所有建構函式前執行。使用此語法意謂日後新增建構函式時,不會忘記加入適當初始化。當建構函式與初始化產生相同成員物件時,請使用初始化器:程式碼易讀且易維護。