2011-04-27 33 views
3

如果我設置某個類的屬性的值並使用final,那麼是否必須將該屬性初始化爲類構造函數的參數?例如,我已經長度的屬性齒條設置爲60個使用已在構造函數中初始化的類的屬性

public class Runs { 
    Teams team; 
    final int racklength=60; 
    int xposteam; 

    public Runs (Teams y) { 
     team=y;   
    } 
} 
+0

您可以縮進代碼格式代碼塊由4個空格(或選擇代碼部分並單擊編輯器中的{}按鈕)。我爲你做了這個,但你可能想編輯這個問題,並試着修改一下格式。 – 2011-04-27 00:30:02

回答

1

你必須始終初始化final屬性,但你可以做到這一點無論是在地方(你首先聲明它),或在其構造函數(或構造函數):

public class Runs { 
    Teams team; 
    final int racklength; // initialization postponed 
    int xposteam; 

    // constructor defaulting racklength to 60 
    public Runs (Teams y){ 
     team=y; 
     racklength=60; 
    } 

    // constructor with variable initialization of final attribute 
    public Runs (int l, Teams y){ 
     team=y; 
     racklength=l; 
    } 

    // error since racklength is not initialized during construction 
    public Runs(){ 
     team=null 
    } 
} 
3

final字段的值必須要麼初始化內嵌或構造。

實施例:

class Foo { 
    final String bar = "bar"; 
    Foo() { 
    } 
} 

class Foo { 
    final String bar; 
    Foo() { 
     bar = "bar"; 
    } 
} 

是可接受的。

1

不,您可以在聲明變量的位置初始化它。而且沒有理由必須將變量與參數分配給構造函數。

+0

*「並沒有理由你必須分配變量的參數給構造函數。」* - 也許我讀你錯了,但是......呃?如果你定義了一個實例級別的常量(這是一個非靜態的final),你可以通過一個構造函數參數來初始化它。否則,如果一個類的所有實例的實例級常量都具有相同的值,那麼我們也可以使其保持不變。 – 2011-04-27 00:38:53

+1

我同意。你的觀點與我所說的不是相互排斥的。 – 2011-04-27 00:47:04

1

不,你不必這樣做。

這兩個工作正常。

public final class SomeClazz { 
    private final int test=10; 
    public SomeClazz(){ 

    } 
    public int getTest() { 
     return test; 
    } 

} 

或者

public final class SomeClazz { 
    private final int test; 
    public SomeClazz(int test){ 
     this.test = test; 
    } 
    public int getTest() { 
     return test; 
    } 

} 

然而,我更喜歡通過構造函數初始化它們,因爲這樣誰正在建設中的對象調用者知道如何與預期值創建對象的狀態。如果它應該是一個常量類型的值,那麼你應該使用Enums,而不是用這種方法在你的班級中定義它們。

+0

爲了做到這一點,您不需要吸氣劑。 – Jeremy 2011-04-27 01:25:29

+0

@Jeremy Heiler - 對。我的意思是將測試聲明爲'private'而不是默認'package private'。我已更新我的帖子。 – CoolBeans 2011-04-27 02:45:30

+0

你完全錯過了我的觀點。絕對不需要聲明一個getter以便最終創建一個類/實例變量。 – Jeremy 2011-04-27 03:25:59

相關問題