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:MutableListfunisListInitialised()=::mList.isInitialized } classPreB{ valmPreA=PreA() funprint(){ if(mPreA.isListInitialised()){ mPreA.mList.add("") } } }
当然通过捕获UninitializedPropertyAccessException异常也是可以
参考:StackOverflow
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。