• Kotlin的关键字 lateinit 和 lazy


    序、完善一下曾经的草稿。

    Kotlin通常要求我们在定义属性后立即对起进行初始化,当我们不知道理想的初始值时,这样做似乎很奇怪,尤其是在生命周期驱动android属性的情况下。

    lateinit

    简介

    lateinit,Kotlin提供的一个可以延迟初始化的方案。和类属性一起使用的时候,lateinit修饰符会阻止该属性在其类的对象构造时被初始化。

    lateinit修饰的变量只有在初始化时才会分配内存,而不是在声明对象时。

    在Kotlin中,所有变量都要有非空限制(Kotlin中是默认是空安全的,任何属性的声明都必须有初始化值)。所以在声明变量的时候有以下两种

    变量支持可空“?”,才能设置为null

        var map: HashMapInt>? = null

    如果我们不做非空操作,则需要给变量初始化赋值(非空属性必须在定义的时候初始化)。

        var map: HashMapInt> = HashMap()
    

    例如在项目中的我们网络请求的数据data变量,首先不想在创建过程中对其初始化,并且我们确定在执行之前,一定会在我们项目的某个地方被赋值。可以使用lateinit。

    1. private lateinit var homeBannerDatas: ArrayList
    2. private lateinit var courseDatas: MutableList

    PS:

    1.lateinit只能修饰, 非kotlin基本类型的变量。

    因为每当lateinit访问一个属性时,Kotlin 都会在后台为其提供一个空值,以指示该属性尚未初始化。原始类型不能是null,因此无法指示未初始化的属性。

    2.只能用在var变量上

    by lazy

    是属性委托一种。它是属性懒加载的一种实现方式,在对属性使用时才对属性进行初始化,并且支持对属性初始化的操作时进行加锁,使属性的初始化在多线程环境下线程安全。lazy默认是线程安全的。

    lazy本质上是创建一个应用,但仅在第一次使用或调用该属性时进行初始化。

    1. //延迟属性lazy
    2. //延迟属性lazy()是一个函数,接受一个Lambda表达式作为参数,返回一个lazy实例的函数。
    3. //返回的实例可以作为实现延迟属性的委托
    4. //第一次调用get()会执行已经传递给lazy()的lambda表达式并记录结果,
    5. //后续调用get()只会返回记录的结果
    6. private val spPrefs: SharedPreferences by lazy {
    7. EduApp.context.getSharedPreferences(file_name, Context.MODE_PRIVATE)
    8. }

  • 相关阅读:
    【数据结构-队列】队列介绍
    Nginx实现tcp代理并支持TLS加密实验
    笔记软件的历史、选择策略以及深度评测
    语雀突发 P0 级事故!宕机 8 小时被网友怒喷,运维又背锅?
    java圣经sqlite3数据库
    【Git】安装和常用命令的使用与讲解及项目搭建和团队开发的出现的问题并且给予解决
    Redis基础知识:redis有16个数据库、redis是单线程的!
    Python学习笔记(2)
    CSS常用技巧
    SpringWeb解析
  • 原文地址:https://blog.csdn.net/qq_37492806/article/details/132344170