Kotlin如何安全訪問lateinit變量

Kotlin設計之初就是不容許非null變量在聲明期間不進行初始化的,爲了解決這個問題,Kotlin lateinit 容許咱們先聲明一個變量,而後在程序執行週期的未來某個時候將其初始化,讓編譯檢查時不會 由於屬性變量未被初始化而報錯。若是未初始化將致使如下異常:git

kotlin.UninitializedPropertyAccessException: lateinit property mList has not been initialized
複製代碼

因此咱們在 Kotlin 1.2及更高版本上,常常使用基於反射的API 快速檢查lateinit屬性是否已初始化。github

private lateinit var mList: MutableList<String>

fun main(args: Array<String>) {
    if (::mList.isInitialized) {
        mList.add("")
    }
}
複製代碼

但若是咱們在一個類中有一個lateinit屬性,而後嘗試在另外一類中檢查它是被初始化,以下所示:bash

class PreA{
    lateinit var mList: MutableList<String>
}

class PreB{
    val mPreA  = PreA()
    fun  print(){
        if (mPreA::mList.isInitialized){

        }
    }
}
複製代碼

會報錯:markdown

Kotlin: Backing field of 'var mList: MutableList<String>' is not accessible at this point
複製代碼

由於該反射API的限定,固然inner class 是被容許的,具體設計細節參考官方oop

因此咱們若有相似需求能夠直接在目標類中添加新方法來檢查lateinit屬性:this

class PreA{
    lateinit var mList: MutableList<String>
    fun isListInitialised() = ::mList.isInitialized
}

class PreB{
    val mPreA  = PreA()
    fun  print(){
        if (mPreA.isListInitialised()){
            mPreA.mList.add("")
        }
    }
}
複製代碼

固然經過捕獲UninitializedPropertyAccessException異常也是能夠spa

參考: StackOverflow設計

相關文章
相關標籤/搜索