lazy函数 可以把需要延迟的函数放在by lazy 代码块中,这块代码在一开始的时候是不回执行的,只有当调用的时候才会执行,实际上,by lazy并不是连在一起的关键字,只有by才是Kotlin的关键字,lazy只是一个高阶函数而已 在lazy函数中会创建并返回一个Delegate对象,当调用该对象时,其实调用的是Delegate对象的getValue()方...
所以SynchronizedLazyImpl 的 value 属性只有 get() 方法,没有 set() 方法。 value 的 get() 方法会先判断 _value 属性是否是 UNINITIALIZED_VALUE,不是的话会返回 _value 的值。 _value 使用@Volatile注解标注,相当于在 Java中 使用 volatile 修饰 _value 属性。volatile 具有可见性、有序性,因此一旦 _value...
publicactualfun<T>lazy(initializer:()->T):Lazy<T>=SynchronizedLazyImpl(initializer)publicactualfun<T>lazy(mode:LazyThreadSafetyMode,initializer:()->T):Lazy<T>=when(mode){LazyThreadSafetyMode.SYNCHRONIZED->SynchronizedLazyImpl(initializer)LazyThreadSafetyMode.PUBLICATION->SafePublicationLazyImpl(initialize...
by lazy更适合不可变的延迟初始化场合,而lateinit则适用于在构造方法之后需要手动初始化的可变属性。
从lazy() 开始分析源码: public actual fun <T> lazy(initializer: () -> T): Lazy<T> = SynchronizedLazyImpl(initializer) actual 是 Kotlin 的关键字表示多平台项目中的一个平台相关实现。 lazy 函数的参数是 initializer,它是一个函数类型。lazy 函数会创建一个 SynchronizedLazyImpl 类,并传入 initializer...
拆解Kotlin中的by lazy:从语法糖到底层实现 by lazy 是Kotlin中一个强大的属性委托机制,它主要用于实现属性的延迟初始化。所谓延迟初始化,就是在第一次访问该属性时才进行初始化,而不是在对象创建时就立即初始化。这种机制在很多场景下都能带来性能优势,特别是当属性的初始化成本较高或者属性可能不会被使用时。
bylazy就是一种委托模式的实现。 在kotlin中,by lazy是属性委托的一种实现方式。它接收一个lambda表达式作为参数,并返回一个Lazy<T>类型的对象。Lazy<T>是kotlin标准库中的一个接口,它定义了延迟初始化属性的行为。 当声明一个属性时,可以使用by lazy将其委托给Lazy<T>对象。在第一次访问该属性时,Lazy<T>...
在Kotlin中,by lazy和lateinit都是用于延迟初始化的手段,但它们各自有不同的用法和特点。下面详细讨论它们的作用和区别。 1.by lazy 作用: by lazy是一种委托属性,用于延迟初始化一个只读属性。属性在第一次访问时才会被初始化,并且初始化操作只会执行一次。
Kotlin中有两种延迟初始化的方式,分别是lateinit var和by lazy。 lateinit var private lateinit var name: String lateinit var只能用来修饰类属性,不能用来修饰局部变量,并且只能用来修饰对象,不能用来修饰基本类型(因为基本类型的属性在类加载后的准备阶段都会被初始化为默认值)。
然而,这种方式不允许我们懒加载这个实例,这时我们就可以使用 by lazy 来代理这个属性。 2. 延迟属性实现 当我们使用 by lazy 来声明一个属性时,编译器实际上会生成一个临时的类,这个类实现了 kotlin.Lazy 接口,并且包含了一个 getValue() 方法,以及一个 private 的属性(叫做 initializer),用于保存 lazy 属性的...