Kotlin如何安全訪問lateinit變量的實現(xiàn)
Kotlin設(shè)計之初就是不允許非null變量在聲明期間不進行初始化的,為了解決這個問題,Kotlin lateinit 允許我們先聲明一個變量,然后在程序執(zhí)行周期的將來某個時候?qū)⑵涑跏蓟?,讓編譯檢查時不會 因為屬性變量未被初始化而報錯。如果未初始化將導(dǎo)致以下異常:
kotlin.UninitializedPropertyAccessException: lateinit property mList has not been initialized
所以我們在 Kotlin 1.2及更高版本上,經(jīng)常使用基于反射的API 快速檢查lateinit屬性是否已初始化。
private lateinit var mList: MutableList<String>
fun main(args: Array<String>) {
if (::mList.isInitialized) {
mList.add("")
}
}
但如果我們在一個類中有一個lateinit屬性,然后嘗試在另一類中檢查它是被初始化,如下所示:
class PreA{
lateinit var mList: MutableList<String>
}
class PreB{
val mPreA = PreA()
fun print(){
if (mPreA::mList.isInitialized){
}
}
}
會報錯:
Kotlin: Backing field of 'var mList: MutableList<String>' is not accessible at this point
因為該反射API的限定,當然inner class 是被允許的,具體設(shè)計細節(jié)參考官方
所以我們?nèi)缬蓄愃菩枨罂梢灾苯釉谀繕祟愔刑砑有路椒▉頇z查lateinit屬性:
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 異常也是可以
參考: StackOverflow
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android 中解決Viewpage調(diào)用notifyDataSetChanged()時界面無刷新的問題
這篇文章主要介紹了Android 中解決Viewpage調(diào)用notifyDataSetChanged()時界面無刷新的問題的相關(guān)資料,這里提供相應(yīng)的解決辦法,需要的朋友可以參考下2017-08-08
Android ScreenLockReceiver監(jiān)聽鎖屏功能示例
這篇文章主要介紹了Android ScreenLockReceiver監(jiān)聽鎖屏功能,結(jié)合實例形式分析了Android監(jiān)聽鎖屏及取消監(jiān)聽功能的具體實現(xiàn)技巧,需要的朋友可以參考下2017-07-07
RecyclerView優(yōu)雅實現(xiàn)復(fù)雜列表布局
這篇文章主要為大家詳細介紹了RecyclerView優(yōu)雅實現(xiàn)復(fù)雜列表布局,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-11-11

