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設計