2016-04-01 79 views
0

從Oracle的guide初始化場(重點煤礦):爲什麼我不能在實例初始化塊中使用final字段?

Java編譯器副本初始化語句塊到每一個構造函數。因此,這種方法可以用來在多個構造函數之間共享一段代碼。

此外,從司法部的article關於Java實例初始化(重點煤礦):

實例的初始化塊代碼中調用超()在構造之後運行,換句話說,後所有超級構造函數都運行了

考慮到這一點,爲什麼每次我嘗試在下面的實例初始化塊中使用(分配的)最終字段時,編譯器都會發出警告?

final class PpTitleBook implements TitleBook { 
    private final Resources resources; 
    private final Log log; 

    PpTitleBook(Resources resources, Log log) { 
    this.resources = resources; 
    this.log = log; 
    } 

    { 
    String[] resTitles = resources.getStringArray(R.array.titles); 

    if (book().getAllKeys().isEmpty()) { 
     for (int i = 0; i < resTitles.length; i++) { 
     newTitle(resTitles[i]); 
     } 
    } 
    } 

我沒有其他的構造函數旁邊的上面顯示。那麼警告背後的真正原因是什麼?

+3

答案在於以下問題:*實例初始化塊代碼在構造函數中調用super()之後運行*因此,在構造函數的其餘代碼初始化最終字段之前執行。而這正是警告信息所說的。 –

+0

另請參見http://stackoverflow.com/questions/20593606/how-non-static-initializer-block-invoked?rq=1(問題是壞的,但答案是好的) –

回答

5

實例初始化程序塊代碼在構造函數的代碼之前執行,因此您的resources變量在被實例初始化程序塊使用之前未被初始化。

由於您只有一個構造函數,因此您可以將實例初始化程序塊的代碼移動到構造函數中。

+0

我很困惑與單詞「將初始化塊複製到Oracle的文檔中的每個構造函數中「。噢,上課時曾經有過一個以上的ctor。我正在進行重構,這一事件引起了我的好奇心。謝謝。 – ridsatrio

+0

@ridsatrio不客氣 – Eran

相關問題