前言
记录一下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异常之应用已停止运行的日志分析
文章之前写过,重新整理一下。为什么会有应用已停止运行?运行时出现了未捕获的异常,导致程序无法正常运行。如下面,主线程(main)出现致命异常(fatal exception)导致程序无法正常运行。 # main主线程,fatal exception 致命异常 AndroidRuntime...
徐志摩:再别康桥
再别康桥轻轻的我走了,正如我轻轻的来;我轻轻的招手,作别西天的云彩。 那河畔的金柳,是夕阳中的新娘;波光里的艳影,在我的心头荡漾。 软泥上的青荇,油油的在水底招摇;在康河的柔波里,我甘心做一条水草! 那榆荫下的一潭,不是清泉,是天上虹...
[摘]为什么要读书?
在当下这个信息爆炸令人眼花缭乱的时代,很多人都会有个疑问我读过很多书,但后来大部分都忘记了,你说这样的阅读究竟有什么意义?“当我还是个孩子时我吃了很多食物,大部分已经一去不复返而且被我忘掉了,但可以肯定的是,它们中的一部分已经长成我的骨头和肉。阅读对你的思想的改变也是如此。” 说的多好啊,是这样的...
新建工程,导入旧的module,出现Android Studio duplicate entry xx.class
前言这个是导入SystemUI时出现的,记录一下,方便自己查阅。好记性不如烂笔头正文导入旧的module后出现:Cause: duplicate entry: androidx/core/R$attr.class更多日志Execution failed for task ':Sys...
Instrumentation的简单记录
前言Instrumentation本身是Android用来做测试的工具,可以通过它监测系统与应用程序之间的交互。本文就介绍Instrumentation在应用中的简单使用。正文模拟事件需要权限<uses-permission android:name="android.permis...