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使用ViewPager实现轮播效果

    android使用ViewPager实现轮播效果

    这篇文章主要为大家详细介绍了android使用ViewPager实现轮播效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Android答题APP的设计与实现

    Android答题APP的设计与实现

    这篇文章主要为大家详细介绍了Android答题APP的设计与实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • android之HttpPost&HttpGet使用方法介绍

    android之HttpPost&HttpGet使用方法介绍

    下文直接讲用法,先知道怎么用,再知道怎么回事,具体如下,感兴趣的朋友可以参考下哈
    2013-06-06
  • Android开发中自定义ProgressBar控件的方法示例

    Android开发中自定义ProgressBar控件的方法示例

    这篇文章主要介绍了Android开发中自定义ProgressBar控件的方法,结合实例形式分析了自定义ProgressBar控件的定义与使用方法,需要的朋友可以参考下
    2017-10-10
  • Android4.4 WebAPI实现拍照上传功能

    Android4.4 WebAPI实现拍照上传功能

    这篇文章主要介绍了Android4.4 WebAPI实现拍照上传功能,本文给出4.4版本后拍照上传的具体实现方法,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Android学习笔记——Menu介绍(一)

    Android学习笔记——Menu介绍(一)

    Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
    2014-10-10
  • Android 中 onSaveInstanceState()使用方法详解

    Android 中 onSaveInstanceState()使用方法详解

    这篇文章主要介绍了Android 中 onSaveInstanceState()使用方法详解的相关资料,希望通过本文大家能够掌握这部分知识,需要的朋友可以参考下
    2017-09-09
  • Android Jetpack架构中ViewModel接口暴露的不合理探究

    Android Jetpack架构中ViewModel接口暴露的不合理探究

    这篇文章主要介绍了Android Jetpack架构组件 ViewModel详解,ViewModel类让数据可在发生屏幕旋转等配置更改后继续存在,ViewModel类旨在以注重生命周期的方式存储和管理界面相关的数据。感兴趣可以来学习一下
    2022-07-07
  • Android手势ImageView三部曲 第一部

    Android手势ImageView三部曲 第一部

    这篇文章主要为大家详细介绍了Android手势ImageView三部曲的第一部,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Android中的Intent对象完全解析

    Android中的Intent对象完全解析

    这篇文章主要介绍了Android中的Intent对象,深入讲解了intent对象传递消息的各种用法,需要的朋友可以参考下
    2016-04-04

最新评论