2017-10-28 87 views
1
public class InitialisingFields { 
    private final String a; 
    private final String b; 
    private final String c; 

    InitialisingFields(String a,String b){ 
     this.a = a; 
     this.b = b; 
    } 

    InitialisingFields(String a,String b,String c){ 
     this(a , b); 
     this.c = c; 
    } 
    public static void main(String[] args) { 
     InitialisingFields i = new InitialisingFields("A","B","C"); 
    } 
} 

我想寫InitialisingFields(String a,String b,String c)構造函數,但它給我編譯錯誤。如何編寫2個構造函數來初始化2個不同的私有最終變量?

InitialisingFields(String a,String b)它說:「最後的空白領域c可沒有被初始化」 & 爲InitialisingFields(String a,String b,String c)它說:「最後的空白領域c可已經被初始化」

我不想修改InitialisingFields(String a,String b)和添加一個參數,因爲它已被很多類使用,我將不得不重構大量的類。並且對於我的用例,我希望使用此類的對象和其他參數。

+0

你想要什麼'C'是如果不提供? –

+2

所有_final_變量必須在_each構造函數_的末尾初始化。 –

+1

我希望c只在我調用構造函數時才被初始化。所以這樣我就不會打破現有的類。 –

回答

3

你應該全面走另一條路 - 有一個構造函數初始化所有的領域,並有其他(一個或多個)以默認值叫它:

InitialisingFields(String a, String b) { 
    this(a, b, null); 
} 

InitialisingFields(String a, String b, String c) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
} 
+0

問題是,如果我修改了現有的構造函數,那麼我必須修復很多類,這個構造函數已經被使用,並且數量巨大。 –

+0

@AmardeepSingh我建議的修正更改了給定構造函數的**實現**,而不是它的**簽名**。您將**不**必須修改任何使用它的代碼。 – Mureinik

+0

太好了,非常感謝。 –

相關問題