Kotlin如何安全訪問lateinit變量的實現(xiàn)
Kotlin設計之初就是不允許非null變量在聲明期間不進行初始化的,為了解決這個問題,Kotlin lateinit 允許我們先聲明一個變量,然后在程序執(zhí)行周期的將來某個時候?qū)⑵涑跏蓟?,讓編譯檢查時不會 因為屬性變量未被初始化而報錯。如果未初始化將導致以下異常:
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 是被允許的,具體設計細節(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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
android使用ViewPager實現(xiàn)輪播效果
這篇文章主要為大家詳細介紹了android使用ViewPager實現(xiàn)輪播效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
android之HttpPost&HttpGet使用方法介紹
下文直接講用法,先知道怎么用,再知道怎么回事,具體如下,感興趣的朋友可以參考下哈2013-06-06
Android開發(fā)中自定義ProgressBar控件的方法示例
這篇文章主要介紹了Android開發(fā)中自定義ProgressBar控件的方法,結合實例形式分析了自定義ProgressBar控件的定義與使用方法,需要的朋友可以參考下2017-10-10
Android4.4 WebAPI實現(xiàn)拍照上傳功能
這篇文章主要介紹了Android4.4 WebAPI實現(xiàn)拍照上傳功能,本文給出4.4版本后拍照上傳的具體實現(xiàn)方法,感興趣的小伙伴們可以參考一下2016-07-07
Android 中 onSaveInstanceState()使用方法詳解
這篇文章主要介紹了Android 中 onSaveInstanceState()使用方法詳解的相關資料,希望通過本文大家能夠掌握這部分知識,需要的朋友可以參考下2017-09-09
Android Jetpack架構中ViewModel接口暴露的不合理探究
這篇文章主要介紹了Android Jetpack架構組件 ViewModel詳解,ViewModel類讓數(shù)據(jù)可在發(fā)生屏幕旋轉(zhuǎn)等配置更改后繼續(xù)存在,ViewModel類旨在以注重生命周期的方式存儲和管理界面相關的數(shù)據(jù)。感興趣可以來學習一下2022-07-07

