lateinit和by lazy简单使用

Android  Kotlin  2024年9月10日 am8:57发布1周前更新 91es.com站长
25 0 0

前言

记录一下Kotlinlateinitby lazy简单使用。

正文

lateinit

为延迟初始化属性。

lateinit用于延迟初始化一个var可变属性。属性类型必须是非空的且不能是原始类型(如 Int, Double)。

经常在类中定义属性时

class Person{
    var name:String;
}

上面会提示

Property must be initialized or be abstract

解决这个可以如下方式

//初始化默认值
var nameA:String = "";

//把Person进行抽象(这肯定不是想要的)
abstract class Person{
   abstract var nameA:String;
}

当然,如果上面两个都不想,那就使用今天的主角lateinit。

使用场景
  1. 需要在构造方法之后初始化的可变属性。

  2. 需要在某个特定操作时才对属性进行赋值。

by lazy

为惰性初始化。

by lazy是一种委托属性,用于延迟初始化一个只读属性。属性在第一次访问时才会被初始化,并且初始化操作只会执行一次。

val property: Type by lazy { initializer }

延迟加载也是委托的一种形式。

val lazyTxt: String by lazy {
    Log.i(TAG,"初始化lazyTxt")
    "lazy"
}
 
Log.d(TAG, " 1 : $lazyTxt")
Log.d(TAG, " 2 : $lazyTxt")

日志打印

初始化lazyTxt
1 : lazy
2 : lazy

只初始化了一次。

要求属性声明为val,即不可变变量,在java中相当于被final修饰。

使用场景
  1. 需要惰性初始化不可变的属性。

  2. 需要线程安全的初始化或者只在单线程中操作。

小结

特性 by lazy lateinit
适用类型 val(只读属性) var(可变属性)
初始化时间 第一次访问时 必须手动初始化
线程安全 默认线程安全 非线程安全
Nullability 支持不可空类型 支持不可空类型
属性检查 不需要显式检查 通过isInitialized检查
自定义 getter/setter 不支持 不支持
使用场景 用于只读且惰性初始化的属性 用于需要在构造函数之外初始化的可变属性

总结来说,选择使用 by lazy 还是 lateinit 要依据属性的特性和具体的使用场景。

by lazy 更适合不可变的延迟初始化场合,而 lateinit 则适用于在构造方法之后需要手动初始化的可变属性。

参考文章

  1. 浅谈Kotlin(六):lateinit、by lazy 使用

  2. Kotlin之 lateinit 和 by lazy

  3. Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?

 历史上的今天

  1. 2023: OkHttp简单介绍之一(0条评论)
  2. 2022: ViewPager2事件冲突问题(0条评论)
  3. 2021: 对Matrix.mapRect()的理解(0条评论)
  4. 2019: 从维熙:夜空中的木拐(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com[备用域名]
3、 本站内容: 部分来源于网络,仅供站长学习和参考,若侵权请留言

暂无评论

暂无评论...

随机推荐

125啦新版来了,欢迎使用

1、好记性不如烂笔头;2、觉得已经晚了,恰恰是最早的时候;3、鸡蛋从外打破是食物,从内打破是生命 我们新版上线啦(掌声),这次改版很大,放弃之前传统的导航模式,首先采用“网址导航+读书(阅读)+博客”全新的模式,依旧是国内第一个以读书(阅读)为主题的网址导航大全!因为热爱,所以折...

[代码片]获取状态栏高度和导航栏高度

前言记录一下,或许后面有用。正文直接上代码 /** * 获取状态栏高度 * * @return */ public int getBarHeight(String name) { int result = 0; ...

Android App启动时间检测

前言记录一下App启动优化,方便自己查阅。正文App启动时间检测adb shell am start -W com.biumall.demo/.MainActivity运行结果ThisTime: 最后一个Activity启动时间 [上面指定了是MainActivity启动时间]To...

林徽因:一片阳光

放了假,春初的日子松弛下来。将午未午时候的阳光,澄黄的一片,由窗棂横浸到室内,晶莹地四处射。我有点发怔,习惯地在沉寂中惊讶我的周围。我望着太阳那湛明的体质,像要辨别它那交织绚烂的色泽,追逐它那不着痕迹的流动。看它洁净地映到书桌上时,我感到桌面上平铺着一种恬静,一种精神上的豪兴,情趣上的闲逸;即或所谓...

GestureDetector使用简介

前言当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等。为了监听上面各种手势,Android sdk给我们提供了GestureDetector类。GestureDetector 是 Android 中,专门用来进行手势监听的一个对象,在他的监听器中,我们...

严歌苓:读书是生命的另一种存在

一、我关于阅读与写作的记忆我出生在一个书香家庭,父亲虽是作家,但他很少用自己的文学理念影响我。在我的生活学习中,父亲就是一个很客观的教师,是我一生中最好的文学伴侣,最好的交流文学的朋友。父亲常与我沟通他最近读的好书,也会建议我去读。每天早上不管多忙,我都要拿出一小时与父亲喝咖啡,然后谈一谈我最近...