Kotlin如何安全訪問(wèn)lateinit變量的實(shí)現(xiàn)
Kotlin設(shè)計(jì)之初就是不允許非null變量在聲明期間不進(jìn)行初始化的,為了解決這個(gè)問(wèn)題,Kotlin lateinit 允許我們先聲明一個(gè)變量,然后在程序執(zhí)行周期的將來(lái)某個(gè)時(shí)候?qū)⑵涑跏蓟?,讓編譯檢查時(shí)不會(huì) 因?yàn)閷傩宰兞课幢怀跏蓟鴪?bào)錯(cuò)。如果未初始化將導(dǎo)致以下異常:
kotlin.UninitializedPropertyAccessException: lateinit property mList has not been initialized
所以我們?cè)?Kotlin 1.2及更高版本上,經(jīng)常使用基于反射的API 快速檢查lateinit屬性是否已初始化。
private lateinit var mList: MutableList<String>
fun main(args: Array<String>) {
if (::mList.isInitialized) {
mList.add("")
}
}
但如果我們?cè)谝粋€(gè)類中有一個(gè)lateinit屬性,然后嘗試在另一類中檢查它是被初始化,如下所示:
class PreA{
lateinit var mList: MutableList<String>
}
class PreB{
val mPreA = PreA()
fun print(){
if (mPreA::mList.isInitialized){
}
}
}
會(huì)報(bào)錯(cuò):
Kotlin: Backing field of 'var mList: MutableList<String>' is not accessible at this point
因?yàn)樵摲瓷銩PI的限定,當(dāng)然inner class 是被允許的,具體設(shè)計(jì)細(xì)節(jié)參考官方
所以我們?nèi)缬蓄愃菩枨罂梢灾苯釉谀繕?biāo)類中添加新方法來(lái)檢查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("")
}
}
}
當(dāng)然通過(guò)捕獲UninitializedPropertyAccessException 異常也是可以
參考: StackOverflow
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
android使用ViewPager實(shí)現(xiàn)輪播效果
這篇文章主要為大家詳細(xì)介紹了android使用ViewPager實(shí)現(xiàn)輪播效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Android答題APP的設(shè)計(jì)與實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android答題APP的設(shè)計(jì)與實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
android之HttpPost&HttpGet使用方法介紹
下文直接講用法,先知道怎么用,再知道怎么回事,具體如下,感興趣的朋友可以參考下哈2013-06-06
Android開(kāi)發(fā)中自定義ProgressBar控件的方法示例
這篇文章主要介紹了Android開(kāi)發(fā)中自定義ProgressBar控件的方法,結(jié)合實(shí)例形式分析了自定義ProgressBar控件的定義與使用方法,需要的朋友可以參考下2017-10-10
Android4.4 WebAPI實(shí)現(xiàn)拍照上傳功能
這篇文章主要介紹了Android4.4 WebAPI實(shí)現(xiàn)拍照上傳功能,本文給出4.4版本后拍照上傳的具體實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下2016-07-07
Android學(xué)習(xí)筆記——Menu介紹(一)
Android3.0(API level 11)開(kāi)始,Android設(shè)備不再需要專門的菜單鍵。隨著這種變化,Android app應(yīng)該取消對(duì)傳統(tǒng)6項(xiàng)菜單的依賴。取而代之的是提供anction bar來(lái)提供基本的用戶功能2014-10-10
Android 中 onSaveInstanceState()使用方法詳解
這篇文章主要介紹了Android 中 onSaveInstanceState()使用方法詳解的相關(guān)資料,希望通過(guò)本文大家能夠掌握這部分知識(shí),需要的朋友可以參考下2017-09-09
Android Jetpack架構(gòu)中ViewModel接口暴露的不合理探究
這篇文章主要介紹了Android Jetpack架構(gòu)組件 ViewModel詳解,ViewModel類讓數(shù)據(jù)可在發(fā)生屏幕旋轉(zhuǎn)等配置更改后繼續(xù)存在,ViewModel類旨在以注重生命周期的方式存儲(chǔ)和管理界面相關(guān)的數(shù)據(jù)。感興趣可以來(lái)學(xué)習(xí)一下2022-07-07
Android手勢(shì)ImageView三部曲 第一部
這篇文章主要為大家詳細(xì)介紹了Android手勢(shì)ImageView三部曲的第一部,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03

