lateinit和by lazy简单使用

Android  Kotlin  2024年9月10日 am8:57发布3个月前更新 城堡大人
80 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、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

吴念真:年糕

阿旺和我读同一个小学,低我两个年级,所以之前我并不认识他,不过他倒知道我,因为小学时代我是学校升降旗典礼的司仪。遇见他的时候,我已经十七岁,他十五岁,两个人都已经在台北工作了。阿旺做事的铁工厂和我住的地方其实就在同一条巷子里,只是没碰过面,直到有一天房东叫铁工来装铁窗,扛着铁架的小助手看看我,...

Android最近任务预览页面,概览屏幕预览图修改,敏感信息预览图隐藏实现

前言这个需求是显示在最近任务栏,但不让人预览。正文关于这个问题,其实让人很恼火,为啥不让人看呢?不过需求贵需求,作为程序猿,我们的任务就是为了完成各种奇葩的需求。下面分享几种可以实现的方式。使用FLAG_SECURE在Activity中的onCreate()中 设置窗口的Flags属...

[摘]repo命令参考手册

前言本文是摘抄的,主要是需要一些repo的使用。记录一下,方便自己查阅。正文repo用法的基本形式为:repo <COMMAND> <OPTIONS>可选项在[]中表示,例如许多命令接收一个项目列表作为参数,你可以通过一组名字或者p本地源目录的path来指定项目...

AudioTrack简单使用

前言之前也记录过简单记录过AudioTrack的使用,但太久了,而且部分接口已经废弃。今天有空,重新记录一下。主要是提供够自己看的。正文这里主要是播放raw中pcm文件的代码片段,分别做了MODE_STREAM和MODE_STATIC两种方式。MODE_STATIC隐藏内容!付费...

Android Button 字母自动变大写记录

前言开发中,Button控件的Text 自动转为大写字母,这里记录一下,方便自己查询。好记性不如烂笔头正文字母自动变大写的原因只要我们用的Theme是Material或API Level 21+的默认 Theme,Button上的Text默认就是大写。解决方式第一种方法在Xml中的...

LocalServices和SystemService等简介

前言在上次简单介绍SystemServer(《SystenServer的启动之一》)时,里面涉及几个比较重要的类SystemServiceManager,SystemService和LocalServices,因此今天就单独介绍一下。正文涉及文件frameworks\base\servic...