Kotlin如何安全访问lateinit变量的实现
Kotlin设计之初就是不允许非null变量在声明期间不进行初始化的,为了解决这个问题,Kotlinlateinit允许我们先声明一个变量,然后在程序执行周期的将来某个时候将其初始化,让编译检查时不会因为属性变量未被初始化而报错。如果未初始化将导致以下异常:
kotlin.UninitializedPropertyAccessException:lateinitpropertymListhasnotbeeninitialized
所以我们在Kotlin1.2及更高版本上,经常使用基于反射的API快速检查lateinit属性是否已初始化。
privatelateinitvarmList:MutableListfunmain(args:Array ){ if(::mList.isInitialized){ mList.add("") } }
但如果我们在一个类中有一个lateinit属性,然后尝试在另一类中检查它是被初始化,如下所示:
classPreA{
lateinitvarmList:MutableList
}
classPreB{
valmPreA=PreA()
funprint(){
if(mPreA::mList.isInitialized){
}
}
}
会报错:
Kotlin:Backingfieldof'varmList:MutableList
'isnotaccessibleatthispoint
因为该反射API的限定,当然innerclass是被允许的,具体设计细节参考官方
所以我们如有类似需求可以直接在目标类中添加新方法来检查lateinit属性:
classPreA{
lateinitvarmList:MutableList
funisListInitialised()=::mList.isInitialized
}
classPreB{
valmPreA=PreA()
funprint(){
if(mPreA.isListInitialised()){
mPreA.mList.add("")
}
}
}
当然通过捕获UninitializedPropertyAccessException异常也是可以
参考:StackOverflow
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
热门推荐
10 八一幼儿祝福语大全简短
11 公司乔迁食堂祝福语简短
12 婚礼结束聚餐祝福语简短
13 儿媳买车妈妈祝福语简短
14 毕业送礼老师祝福语简短
15 同事辞职正常祝福语简短
16 恭贺新婚文案祝福语简短
17 金店立秋祝福语简短英文
18 婆婆高寿祝福语大全简短