2012-06-19 97 views
0

我見過開發人員用不同的方式初始化他們的類字段。其中三個非常受歡迎! 有什麼不同,它們中的哪一個更合適?如何初始化類字段?

class Test { 
    ArrayList<String> myArr = new ArrayList<String>(); // First Method 
} 


class Test { 
    ArrayList<String> myArr; 
    public Test() { 
     myArr = new ArrayList<String>(); // Second Method 
    } 
} 


class Test { 
    ArrayList<String> myArr; 
    public Test() { 
    } 
    public void Init() { 
     myArr = new ArrayList<String>(); // Third Method 
    } 
} 

回答

4

1和2是更多或更少等效,也讓您使用final修改場上。

(不同的是,在情況1中,該字段被構造函數調用之前,而在情況2中,被調用的構造,當字段被初始化初始化。)

3是延遲初始化模式。

+1

1和2不等價。實例變量在任何構造函數被調用之前被實例化。 – Perception

+0

@Perception確定,確定;) – sudocode

+0

+1爲您的更新的答案! – Perception

1

第一個和第二個之間沒有太大區別:差異更具語法性。

在第一種方法中,您將聲明和定義放在一起,所以您不會忘記初始化變量。

如果您想基於某些條件進行不同的初始化,第二種和第三種方法允許更大的靈活性。

第三個是更多的框架,你必須有一個無參數的構造函數,並將分別調用「真正的」初始值設定方法(具有所有必要的參數)。第三種方法還允許對象更容易「重置」到其初始狀態。

:如果你有一個final場,你只能使用第一或第二種方法,因爲它不能被重新分配,一旦INTIAL分配發生和分配具有由構造年底發生

0

這是關於控制和可讀性:

第一個和第二個是等價的。

第二個幫助您控制初始化的順序。

第三個可以提供延遲(懶惰初始化),就像你測試你的類並且不想創建所有東西一樣。

1

1和2是等效的,但是如果變量是靜態然後行爲不同如以下代碼

public class Test { 
static String s="2"; // 1 

Test() 
{ 
    System.out.println(s); 
    s="3"; //2 
} 

public static void main(String[] args) throws IOException { 

    System.out.println("1="+s); 
    new Test(); 
    System.out.println("1="+s); 
} 

在1個初始化時發生類負載但如果初始化在構造靜態變量(2)然後值將被分配當構造對象時。

3)根據需要,您正在初始化變量。

class Test { 
ArrayList<String> myArr; 
public Test() { 
} 
public void Init() { 
    myArr = new ArrayList<String>(); // Third Method 
} 
}