Kotlin的惰性委托(delegate)属性lazy和lazyFast有什么区别?因为它看起来像相同的代码。

  private val key: String by lazy {
        if (arguments != null && arguments?.getString(Constants.KEY) != null) {
            return@lazy arguments?.getString(Constants.KEY).toString()
        } else {
            return@lazy ""
        }
    }

 private val key: String by lazyFast {
        if (arguments != null && arguments?.getString(Constants.KEY) != null) {
            return@lazyFast arguments?.getString(Constants.KEY).toString()
        } else {
            return@lazyFast ""
        }
    }

最佳答案

懒惰:-

  • 它表示具有延迟初始化的值。
  • 获取当前Lazy实例的延迟初始化值。值初始化后,在此Lazy实例的整个生存期内都不得更改。



  • lazy返回一个Lazy对象,该对象处理lambda函数(初始化程序),该函数根据线程执行模式(LazyThreadSafetyMode)以稍微不同的方式执行初始化。
    public actual fun <T> lazy(mode: LazyThreadSafetyMode, initializer: ()
            -> T): Lazy<T> =
                    when (mode) {
                        LazyThreadSafetyMode.SYNCHRONIZED -> SynchronizedLazyImpl(initializer)
                        LazyThreadSafetyMode.PUBLICATION -> SafePublicationLazyImpl(initializer)
                        LazyThreadSafetyMode.NONE -> UnsafeLazyImpl(initializer)
    }
    

    lazyFast:-



    lazyFast还返回模式为LazyThreadSafetyMode.NONE的Lazy对象。
    fun <T> lazyFast(operation: () -> T): Lazy<T> = lazy(LazyThreadSafetyMode.NONE) {
        operation()
    }
    

    LazyThreadSafetyMode.SYNCHRONIZED:-
  • 锁用于确保只有一个线程可以初始化Lazy实例。

  • LazyThreadSafetyMode.PUBLICATION:-

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

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