Kotlin如何安全访问lateinit变量的实现

 更新时间:2020年01月08日 09:35:43   作者:Reducto  
这篇文章主要介绍了Kotlin如何安全访问lateinit变量的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Kotlin设计之初就是不允许非null变量在声明期间不进行初始化的,为了解决这个问题,Kotlin lateinit 允许我们先声明一个变量,然后在程序执行周期的将来某个时候将其初始化,让编译检查时不会 因为属性变量未被初始化而报错。如果未初始化将导致以下异常:

kotlin.UninitializedPropertyAccessException: lateinit property mList has not been initialized

所以我们在 Kotlin 1.2及更高版本上,经常使用基于反射的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 是被允许的,具体设计细节参考官方

所以我们如有类似需求可以直接在目标类中添加新方法来检查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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android实现两个数相加功能

    Android实现两个数相加功能

    这篇文章主要为大家详细介绍了Android实现两个数相加功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Android实现指定时间定时触发方法

    Android实现指定时间定时触发方法

    这篇文章主要为大家详细介绍了Android实现指定时间定时触发方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • flutter 实现多布局列表的示例代码

    flutter 实现多布局列表的示例代码

    这篇文章主要介绍了flutter 实现多布局列表的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Android 中解决Viewpage调用notifyDataSetChanged()时界面无刷新的问题

    Android 中解决Viewpage调用notifyDataSetChanged()时界面无刷新的问题

    这篇文章主要介绍了Android 中解决Viewpage调用notifyDataSetChanged()时界面无刷新的问题的相关资料,这里提供相应的解决办法,需要的朋友可以参考下
    2017-08-08
  • Android ScreenLockReceiver监听锁屏功能示例

    Android ScreenLockReceiver监听锁屏功能示例

    这篇文章主要介绍了Android ScreenLockReceiver监听锁屏功能,结合实例形式分析了Android监听锁屏及取消监听功能的具体实现技巧,需要的朋友可以参考下
    2017-07-07
  • Android内存优化杂谈

    Android内存优化杂谈

    这篇文章主要介绍了Android内存优化的方法,重点介绍优化RAM,即降低运行时内存,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • Android选择与上传图片之Matisse教程

    Android选择与上传图片之Matisse教程

    这篇文章主要介绍了在Android中对于图片的选择与上传方法,本文介绍了Matisse的相关使用教程,学习Android的同学进来看看吧
    2021-08-08
  • Android实现自定义曲线图

    Android实现自定义曲线图

    这篇文章主要为大家详细介绍了Android实现自定义曲线图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • RecyclerView优雅实现复杂列表布局

    RecyclerView优雅实现复杂列表布局

    这篇文章主要为大家详细介绍了RecyclerView优雅实现复杂列表布局,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • Android Gradle同步优化详解

    Android Gradle同步优化详解

    这篇文章主要为大家介绍了Android Gradle同步优化示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论