lateinit by lazy

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lateinit by lazy相关的知识,希望对你有一定的参考价值。

参考技术A

Kotlin中延迟初始化的方法:
lateinit , by lazy

lateinit用在var变量,作用:编译器检查时不因为变量未初始化而报错。

private lateinit var mRootView: View

然后在inflateView之后再对变量进行赋值,使用的时候默认非空

by lazy 属性委托, 用在val常量(相当于java 中final变量):

private val a: Int by lazy 5

虽然两者都可以推迟属性初始化的时间,但是lateinit var只是让编译期忽略对属性未初始化的检查,后续在哪里以及何时初始化还需要开发者自己决定。

而by lazy真正做到了声明的同时也指定了延迟初始化时的行为,在属性被第一次被使用的时候才自动初始化,且保证了线程安全。

初始化时 默认的线程执行模式:
LazyThreadSafetyMode.SYNCHRONIZED:-
锁用于确保只有一个线程可以初始化Lazy实例。

LazyThreadSafetyMode.PUBLICATION:-
并发访问未初始化的Lazy实例值时,可以多次调用
Initializer函数,但是只有第一个返回的值将用作Lazy实例的值。

LazyThreadSafetyMode.NONE:-
不使用锁来同步对Lazy实例值的访问。如果从多个线程访问该实例,则其行为是不确定的。除非保证永不从多个线程初始化Lazy实例,否则不应使用此模式。

以上是关于lateinit by lazy的主要内容,如果未能解决你的问题,请参考以下文章

使用“by lazy”与“lateinit”进行属性初始化

定义全局 android.widget var/val 时的“lateinit”或“by lazy”

Kotlin 中的 by lazy与lateinit

Kotlin 知识点

kotlin的by lazy

如何检查“lateinit”变量是不是已初始化?