by lazy更适合不可变的延迟初始化场合,而lateinit则适用于在构造方法之后需要手动初始化的可变属性。
Caused by:kotlin.UninitializedPropertyAccessException:lateinit property datas has not been initialized lateinit使用限制: 只能用来修饰类属性,不能用来修饰局部变量, 只能用来修饰对象,不能用来修饰基本类型(因为基本类型的属性在类加载后的准备阶段都会被初始化为默认值)。 二、by lazy的使用 用法即先不进行初始化操...
1. by lazy 的线程安全机制 by lazy默认使用SYNCHRONIZED模式,内部使用了同步锁来保证线程安全: class ThreadSafetyDemo { // 默认是 SYNCHRONIZED 模式 private val lazyValue by lazy { println("初始化 lazy 值,线程:${Thread.currentThread().name}") "Lazy Value" } // 等同于以下显式声明 private val ...
by lazy是Kotlin中的一种属性委托(Property Delegation),它允许我们将属性的初始化延迟到第一次访问该属性时。by lazy通常用于那些初始化成本较高或不需要立即初始化的属性。 1.2by lazy的使用方式 by lazy的使用非常简单,只需要在属性声明时使用by lazy关键字,并提供一个初始化表达式即可。例如: vallazyValue: Str...
importkotlin.reflect.KProperty// 定义包含属性委托的类classExample{varp:StringbyDelegate()}// 委托的类classDelegate{operatorfungetValue(thisRef:Any?,property:KProperty<*>):String{return"$thisRef, 这里委托了 ${property.name} 属性"}operatorfunsetValue(thisRef:Any?,property:KProperty<*>,value:String...
在上面的Demo中,我们看到demoString$delegate是在构造方法中去赋值的,通过方法去创建,但是为什么lazy方法参数是?这里是有一些问题的,实际上参数应该是我们传入的lambda表达式{ "aa" },我们可以通过字节码去查看: $ javap-c Demo.classCompiledfrom""publicfinalclasscom.example.hiltdemo.other.Demo{publicfinal...
INVOKESTATIC kotlin/LazyKt.lazy (Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy; PUTFIELD com/example/newtestproject/LazyClassTest.lazyTest$delegate : Lkotlin/Lazy; L2 LINENUMBER 5 L2 RETURN L3 LOCALVARIABLE this Lcom/example/newtestproject/LazyClassTest; L0 L3 0 ...
除了线程安全,by lazy还具有惰性加载的特性。这意味着如果我们没有访问该属性,它将永远不会被初始化。这种特性可以避免在对象创建时立即执行耗时的初始化操作,从而提高程序的性能和内存效率。 下面是一个简单的示例,演示了如何使用by lazy来延迟初始化属性: kotlin class Example { val lazyProperty: String by lazy...
by lazy本身是一种属性委托。属性委托的关键字是by。by lazy 的写法如下: //用于属性延迟初始化 val name: Int by lazy { 1 } //用于局部变量延迟初始化 public fun foo() { val bar by lazy { "hello" } println(bar) } by lazy具体是怎么实现的: ...
courseName = courseRepository.getCourseName(courseId)// this is an example, you can add other suff according to your usecase} AI代码助手复制代码 我们需要非常确定 lateinit 变量在访问它之前会被初始化,否则会报错: UninitializedPropertyAccessException: lateinit property courseName has not been initialized...