Kotlin的关键字 lateinit 和 lazy

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

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

lateinit

简介

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

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

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

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

Kotlin 复制代码
    var map: HashMap<String, Int>? = null

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

Kotlin 复制代码
    var map: HashMap<String, Int> = HashMap()

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

Kotlin 复制代码
    private lateinit var homeBannerDatas: ArrayList<HomeBanner>
    private lateinit var courseDatas: MutableList<CourseTypeBean>

PS:

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

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

2.只能用在var变量上

by lazy

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

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

Kotlin 复制代码
         //延迟属性lazy
        //延迟属性lazy()是一个函数,接受一个Lambda表达式作为参数,返回一个lazy<T>实例的函数。
        //返回的实例可以作为实现延迟属性的委托
        //第一次调用get()会执行已经传递给lazy()的lambda表达式并记录结果,
        //后续调用get()只会返回记录的结果
        private val spPrefs: SharedPreferences by lazy {
            EduApp.context.getSharedPreferences(file_name, Context.MODE_PRIVATE)
        }
相关推荐
钢铁男儿8 分钟前
C# 异步编程(计时器)
开发语言·c#
阿豪元代码20 分钟前
深入理解 SurfaceFlinger —— 如何调试 SurfaceFlinger
android
阿豪元代码26 分钟前
深入理解 SurfaceFlinger —— 概述
android
小王不爱笑13237 分钟前
Java项目基本流程(三)
java·开发语言
teeeeeeemo1 小时前
js 实现 ajax 并发请求
开发语言·前端·javascript·笔记·ajax
CV资深专家2 小时前
Launcher3启动
android
玄月初二丶2 小时前
C语言变量的声明和定义有什么区别?
c语言·开发语言·变量
YA3332 小时前
java基础(六)jvm
java·开发语言
stevenzqzq2 小时前
glide缓存策略和缓存命中
android·缓存·glide
西猫雷婶2 小时前
scikit-learn/sklearn学习|岭回归解读
开发语言·人工智能·机器学习·支持向量机·回归·scikit-learn·sklearn