2017-08-14 25 views
1

初始化類變量答:在初始化塊什麼是正確的位置在科特林

private class ViewHolder(view: View) { 
    val menuImg: ImageView 
    val txtMenu: TextView 

    init { 
     menuImg = view.find(R.id.menuImg) 
     txtMenu = view.find(R.id.txtMenu) 
    } 
} 

乙初始化類變量:初始化類變量直接在類塊

private class ViewHolder(view: View) { 
    val menuImg: ImageView = view.find(R.id.menuImg) 
    val txtMenu: TextView = view.find(R.id.txtMenu) 
} 

哪兩個代碼之間的不同爲什麼?

+3

它們之間沒有什麼不同。 'init'塊是初始化屬性需要多個語句的一種便捷方式。而你的代碼沒有任何無法編譯的轉換表達式。 –

+0

注意在第二個代碼片段中重複'= menuImg',否則我更喜歡那個版本;申報和分配在一個地方。 (編輯:哇你修好了那個快!!) – AjahnCharles

+0

holi-java謝謝你的解釋; –

回答

1

這些選項A和B的執行沒有區別: 屬性初始值設定項(立即賦值)和初始化塊(使用init塊)。但是對於像你的代碼這樣簡單的初始化,通常在你的情況下使用Property初始值設定項 - 選項B.

但是,如果您在代碼中使用兩個版本,請注意初始化程序的執行順序。

this article報價:

首先,默認的構造函數的參數進行評估,從 參數直接打電話給您,然後論證 任何委託構造函數的構造。接下來,初始化程序(屬性 初始值設定項和初始化塊)按照在類中定義的 的順序執行,從頂部到底部。最後,執行構造函數 ,從主構造函數開始,並通過委託構造函數向外移動 ,直到執行了名爲 的構造函數。

+0

這是非常有益的 –