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