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设计

相关文章
相关标签/搜索