//用于属性延迟初始化val name:Int by lazy{1}//用于局部变量延迟初始化publicfunfoo(){val bar by lazy{"hello"}println(bar)} by lazy具体是怎么实现的:生成一个该属性的附加属性:nameXXdelegate 在构造器中,将使用lazy(()->T)创建的Lazy实例对象赋值给nameXXdelegate; 当该属性被调用,即其getter方法被调...
$ javap-c Demo.classCompiledfrom""publicfinalclasscom.example.hiltdemo.other.Demo{publicfinaljava.lang.StringgetDemoString();Code:0:aload_01:getfield #11// Field demoString$delegate:Lkotlin/Lazy;4:astore_15:aload_06:astore_27:aconst_null8:astore_39:iconst_010:istore412:aload_113:invokeinter...
by lazy更适合不可变的延迟初始化场合,而lateinit则适用于在构造方法之后需要手动初始化的可变属性。
putfield 'com/example/newtestproject/LazyClassTest.lazyTest$delegate','Lkotlin/Lazy;' 1. 2. 3. 4. 在初始化的时候,只是调用了kotlin/LazyKt.lazy类的一个静态方法,针对属性复制的putfield指令,也只是对LazyClassTest.lazyTest$delegate这个内部类的一个Lkotlin/Lazy对象进行赋值,看起来其实跟我们的lazyTest...
by:接口后声明,接上受委托的对象 Example: class MySet1<T>(private val helperSet: HashSet<T>) : Set<T> by helperSet {} 1. class MySet1<T>(private val helperSet: HashSet<T>) : Set<T> by helperSet { fun helloWorld() = println("Hello World") ...
importkotlin.reflect.KProperty// 定义包含属性委托的类classExample{varp:StringbyDelegate()}// 委托的类classDelegate{operatorfungetValue(thisRef:Any?,property:KProperty<*>):String{return"$thisRef, 这里委托了 ${property.name} 属性"}operatorfunsetValue(thisRef:Any?,property:KProperty<*>,value:String...
除了线程安全,by lazy还具有惰性加载的特性。这意味着如果我们没有访问该属性,它将永远不会被初始化。这种特性可以避免在对象创建时立即执行耗时的初始化操作,从而提高程序的性能和内存效率。 下面是一个简单的示例,演示了如何使用by lazy来延迟初始化属性: kotlin class Example { val lazyProperty: String by lazy...
除了线程安全,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具体是怎么实现的: ...