Kotlin-簡約之美-進階篇(六):延遲初始化lateinit var和by lazy

Koltin中屬性在聲明的同時也要求要被初始化,否則會報錯。 例如以下代碼:

private var name0: String //報錯
private var name1: String = "xiaoming" //不報錯
private var name2: String? = null //不報錯

可是有的時候,我并不想聲明一個類型可空的對象,而且我也沒辦法在對象一聲明的時候就為它初始化,那么這時就需要用到Kotlin提供的延遲初始化。Kotlin中有兩種延遲初始化的方式。一種是lateinit var,一種是by lazy。

lateinit var

private lateinit var name: String
  1. lateinit var只能用來修飾類屬性,不能用來修飾局部變量,并且只能用來修飾對象,不能用來修飾基本類型(因為基本類型的屬性在類加載后的準備階段都會被初始化為默認值)。
  2. lateinit var的作用也比較簡單,就是讓編譯期在檢查時不要因為屬性變量未被初始化而報錯。
  3. Kotlin相信當開發(fā)者顯式使用lateinit var 關鍵字的時候,他一定也會在后面某個合理的時機將該屬性對象初始化的

by lazy

by lazy本身是一種屬性委托。屬性委托的關鍵字是by。by lazy 的寫法如下:

//用于屬性延遲初始化
val name: Int by lazy { 1 }

//用于局部變量延遲初始化
public fun foo() {
    val bar by lazy { "hello" }
    println(bar)
}

by lazy具體是怎么實現(xiàn)的:生成一個該屬性的附加屬性:nameXXdelegate
在構造器中,將使用lazy(()->T)創(chuàng)建的Lazy實例對象賦值給nameXXdelegate;
當該屬性被調用,即其getter方法被調用時返回nameXXdelegate.getVaule(),而nameXXdelegate.getVaule()方法的返回結果是對象nameXXdelegate內(nèi)部的_value屬性值,在getVaule()第一次被調用時會將_value進行初始化,往后都是直接將_value的值返回,從而實現(xiàn)屬性值的唯一一次初始化。

lateinit var和by lazy使用區(qū)別?

雖然兩者都可以推遲屬性初始化的時間,但是lateinit var只是讓編譯期忽略對屬性未初始化的檢查,后續(xù)在哪里以及何時初始化還需要開發(fā)者自己決定。而by lazy真正做到了聲明的同時也指定了延遲初始化時的行為,在屬性被第一次被使用的時候能自動初始化。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容