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)
        }
相关推荐
2601_966949653 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
晨曦中的暮雨5 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
喵了几个咪5 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
程序员清风6 小时前
数据处理脚本工程化:日志、配置、命令行与测试
服务器·开发语言·数据库
2601_962885727 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
独隅7 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
Wang's Blog8 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
下一站春风里9 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
天外飞雨道沧桑10 小时前
我在浏览器里练了一个 792 参数的大模型,它学会了补全 JavaScript
开发语言·javascript·ai·ecmascript·ai编程
hhhjhl10 小时前
Yup 跨端三方库仓颉适配全流程
java·开发语言