2016-03-01 108 views
1

可以說我有一類「ComputerInsane」與私人領域「cpuCount」和一個默認的構造函數,像這樣:當我應該初始化構造函數內部的類字段和外部構造函數?

public class ComputerInsane { 

    private int cpuCount = 23; 

    public ComputerInsane() { 
    //default constructor 


    } 

} 

現在我可以初始化cpuCount構造外的23值像上面,因此,當我在類的外部創建類computerInsane的實例時,私有字段cpuCount將自動初始化爲23.但是,我也可以在聲明變量之後在構造函數中進行初始化,如下所示:

public class ComputerInsane { 

    private int cpuCount; 

    public ComputerInsane() { 
    //default constructor 

     cpuCount = 23; 

    } 

} 

這樣它也會在我創建時自動調用當調用默認構造函數時,類computerInsane的一個實例。我的問題是這兩種字段初始化之間的實際區別是什麼,我應該做第一個還是第二個變體?

更重要的是,可以說這些字段是需要用「new」或數組初始化的其他類的對象,因爲它們還需要用「new」初始化。在同樣的意義上,我然後去:

public class ComputerInsane { 


    private int cpuCount = 23; 
    private int[] someArray = new int[10]; 
    Someclass object1 = new Someclass(); 


    public ComputerInsane() { 
    //default constructor 


    } 

} 

還是我去:

public class ComputerInsane { 

    private int cpuCount; 
    private int[] someArray; 
    Someclass object1; 

    public ComputerInsane(){ 
    //default constructor 

    cpuCount = 23; 
    someArray = new int[10]; 
    object1 = new Someclass(); 


    } 

} 

更重要的是preferrable,什麼我應該做的?

+0

如果它是一個文字或一個常量,它並不重要。如果它取決於一個參數,那麼它應該在構造函數中。 (在你的例子中有幾個語法錯誤,以及你可能想要堅持Java命名約定) – SomeJavaGuy

回答

1

你應該做你認爲最簡單最乾淨的事情。我更喜歡第一個選項,因爲它是最簡單的恕我直言。

否則它做同樣的事情。

所以你說不要使用構造函數進行初始化?

實際上,字段初始化全部發生在運行時的構造函數中。

我經常聽到構造函數有初始化變量,如果沒有什麼「應該」在構造函數中發生,你的意思是?

因此,您以任何方式使用構造函數。注意:有很多你不能在一個簡單的班輪上做。

例如

public MyClass(int num) { 
    this.num = num; // has to be in the constructor. 
    try { // this could be in an initialiser block, but better here 
     this.a = someOperation(); 
    } catch (IOException e) { 
     // must be caught 
    } 
} 
+0

所以你說不要使用構造函數進行初始化?我經常聽說構造函數在那裏用於初始化變量,如果沒有,那麼在構造函數中應該發生什麼呢? – user5846939

+1

@OfeliavanAnalhard它有可變初始化。但我認爲他的意思是說它可以像第一個變量不依賴於初始化參數的情況。 – SomeJavaGuy

0

這些特定領域的情況下,cpuCount看起來並不像它會在運行時改變,所以它可能是爲final關鍵字一個很好的候選人。這表明一個值是一個常數。這種方法有一個特殊的命名約定,並且在聲明的同一行上附加一個初始化約定。

private final int CPU_COUNT = 23; 

但是,你得到的對象和數組,看起來像他們將被操縱。所以他們應該在構造函數中初始化。

private final int CPU_COUNT = 23; 

public ComputerInsane() { 
    this.someArray = new int[10]; 
    // etc 
} 

所以你的常數值是內聯初始化的,就像最終值的標準一樣。你的其他值是在構造函數中創建的,因爲正如你所說的,這是創建實例變量的一個聲音。

額外的閱讀

  • 我強烈建議您閱讀Java Naming Conventions。你的班級名稱有點偏離。

  • 請仔細閱讀關於final關鍵字here的其他用途。

0

這取決於你將來要做什麼。也許你想使一個新的構造函數來乘以你的計數,像

public ComputerInsane (int multiCount){ } 

這種方式,你可以做

private int cpuCount = 23; 

public ComputerInsane (int multiCount){ 
    cpuCount *= multiCount; 
} 

private int cpuCount; 

public ComputerInsane (int multiCount){ 
    cpuCount = 23 * multiCount; 
} 

隨着第一個解決方案,你不能使cpuCountfinal,您可能需要,第二個解決方案支持cpuCount作爲final字段。

private final int cpuCount; 

public ComputerInsane (int multiCount){ 
    cpuCount = 23 * multiCount; 
} 
0

在構造函數體之前執行的構造函數之外的初始化。 重要的是要了解在構造函數之外和之內是否都有初始化,因此構造函數初始化會執行最後一個並覆蓋預定義的值。

這是更好地使用初始化構造函數,如果值是相同所有的時間,但如果你有一個初始化場不同許多構造函數,所以最好把這個邏輯構造。