前言
记录一下Kotlin中lateinit和by 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; }
使用场景
-
需要在构造方法之后初始化的可变属性。
-
需要在某个特定操作时才对属性进行赋值。
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修饰。
使用场景
-
需要惰性初始化不可变的属性。
-
需要线程安全的初始化或者只在单线程中操作。
小结
特性 | by lazy | lateinit |
---|---|---|
适用类型 | val(只读属性) | var(可变属性) |
初始化时间 | 第一次访问时 | 必须手动初始化 |
线程安全 | 默认线程安全 | 非线程安全 |
Nullability | 支持不可空类型 | 支持不可空类型 |
属性检查 | 不需要显式检查 | 通过isInitialized检查 |
自定义 getter/setter | 不支持 | 不支持 |
使用场景 | 用于只读且惰性初始化的属性 | 用于需要在构造函数之外初始化的可变属性 |
总结来说,选择使用 by lazy 还是 lateinit 要依据属性的特性和具体的使用场景。
by lazy 更适合不可变的延迟初始化场合,而 lateinit 则适用于在构造方法之后需要手动初始化的可变属性。
参考文章
-
《》
-
《》
-
《
历史上的今天
暂无评论...
随机推荐
吴念真:年糕
阿旺和我读同一个小学,低我两个年级,所以之前我并不认识他,不过他倒知道我,因为小学时代我是学校升降旗典礼的司仪。遇见他的时候,我已经十七岁,他十五岁,两个人都已经在台北工作了。阿旺做事的铁工厂和我住的地方其实就在同一条巷子里,只是没碰过面,直到有一天房东叫铁工来装铁窗,扛着铁架的小助手看看我,...
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...