当前位置: 首页 > wzjs >正文

专业制作网站 郑利用access做网站

专业制作网站 郑,利用access做网站,网站建设费计入什么费用,网站系统功能描述lazy 委托是 Kotlin 的一种属性委托,用于实现延迟初始化。所谓属性委托,就是将属性的 getter 和 setter 操作委托给其他对象来处理。lazy 委托允许我们在第一次访问属性时才进行初始化,后续访问直接返回已缓存的值。这种机制可以提高性能&…

lazy 委托是 Kotlin 的一种属性委托,用于实现延迟初始化。所谓属性委托,就是将属性的 getter 和 setter 操作委托给其他对象来处理。lazy 委托允许我们在第一次访问属性时才进行初始化,后续访问直接返回已缓存的值。这种机制可以提高性能,避免不必要的开销,尤其是在处理开销较大的对象时。

使用

val lazyVal: String by lazy {println("Computed")"Lazy"
}
println(lazyVal)  // 输出: Computed, Lazy
println(lazyVal)  // 输出: Lazy(不再计算)

lazyVal 使用 lazy 委托延迟初始化,只有首次访问时执行初始化块 { println("Computed"); "Lazy" },后续访问直接返回缓存值。

底层实现原理

lazy 是一个高阶函数,定义在 Kotlin 标准库中:

public fun <T> lazy(initializer: () -> T): Lazy<T> = SynchronizedLazyImpl(initializer)

参数 initializer: () -> T 是一个无参 Lambda,返回类型为 T(此处 TString)。返回 Lazy<T> 接口实例,具体实现是 SynchronizedLazyImpl

Lazy<T> 接口:

public interface Lazy<out T> {val value: T // 获取委托值fun isInitialized(): Boolean // 检查是否已初始化
}

这里把 lazyVal 的初始化逻辑封装在一个 Lazy 对象中,后续访问 lazyVal 时,实际上是访问这个 Lazy 对象的 value 属性。

lazy 默认使用 SynchronizedLazyImpl,其代码如下:

private class SynchronizedLazyImpl<out T>(initializer: () -> T, lock: Any? = null) : Lazy<T>, Serializable {private var initializer: (() -> T)? = initializer@Volatile // 确保多线程环境下的可见性private var _value: Any? = UNINITIALIZED_VALUE// final field to ensure safe publication of 'SynchronizedLazyImpl' itself through// var lazy = lazy() {}private val lock = lock ?: this // 使用自身作为锁override val value: Tget() {val _v1 = _value// 如果 _value 已经初始化,直接返回if (_v1 !== UNINITIALIZED_VALUE) {@Suppress("UNCHECKED_CAST")return _v1 as T}return synchronized(lock) {val _v2 = _valueif (_v2 !== UNINITIALIZED_VALUE) { // 再次检查,避免多线程下重复初始化@Suppress("UNCHECKED_CAST") (_v2 as T)} else {val typedValue = initializer!!() // 调用 initializer 初始化值_value = typedValueinitializer = nulltypedValue}}}override fun isInitialized(): Boolean = _value !== UNINITIALIZED_VALUEoverride fun toString(): String = if (isInitialized()) value.toString() else "Lazy value not initialized yet."private fun writeReplace(): Any = InitializedLazyImpl(value)
}

_value 初始为 UNINITIALIZED_VALUE(哨兵对象)。首次访问 value 时,检查 _value 是否未初始化,若是则调用 initializer()(即 { println("Computed"); "Lazy" })。

使用 @Volatile 确保 _value 的可见性。synchronized(lock) 实现双重检查锁(Double-Checked Locking),保证多线程环境下初始化只执行一次。

初始化后,_value 保存结果("Lazy"),后续访问直接返回,无需再次调用 initializer

Kotlin 编译器将 lazyVal 的访问转换为对 Lazy 对象的调用。简化后的字节码(伪代码):

// 编译前
val lazyVal: String by lazy { println("Computed"); "Lazy" }// 编译后(大致等效)
private val lazyVal$delegate: Lazy<String> = lazy { println("Computed"); "Lazy" }
val lazyVal: Stringget() = lazyVal$delegate.value

第一次 lazyVal 访问调用 lazyVal$delegate.valueSynchronizedLazyImpl 执行 initializer,打印 Computed,返回 "Lazy",并缓存。

第二次访问直接返回缓存的 _value"Lazy"),无 initializer 调用。

lazy 支持不同线程安全模式,通过 LazyThreadSafetyMode 参数:

val lazyVal: String by lazy(LazyThreadSafetyMode.NONE) { "Lazy" } // 无同步,单线程使用
val lazyValPub: String by lazy(LazyThreadSafetyMode.PUBLICATION) { "Lazy" } // 允许多线程初始化,最终一致

默认 SYNCHRONIZED(如上述代码)适合多线程场景。

总结

属性委托(by)将 get 操作转发给 Lazylazy 委托通过 SynchronizedLazyImpl 实现延迟初始化。使用双重检查锁确保线程安全,首次访问执行 initializer,后续返回缓存值。编译器将 lazyVal 转换为 Lazy 对象的 value 访问。

lazy 适合昂贵初始化的场景(如数据库连接、配置加载)。注意线程安全模式的选择(默认 SYNCHRONIZED 适合多数场景)。

通过 lazy 委托,Kotlin 提供了一种高效、线程安全的延迟初始化机制。


文章转载自:

http://WJvV2gvB.dnhdp.cn
http://DMzxZ291.dnhdp.cn
http://MwLarvLt.dnhdp.cn
http://3qELz6Fd.dnhdp.cn
http://1InSetqS.dnhdp.cn
http://dDcIge3P.dnhdp.cn
http://TJXnIO4K.dnhdp.cn
http://xYYB7D0X.dnhdp.cn
http://aIkMWc6O.dnhdp.cn
http://k0B25npP.dnhdp.cn
http://vdSDk5DU.dnhdp.cn
http://TGMm0Iuw.dnhdp.cn
http://l89z0B4o.dnhdp.cn
http://6Sbg5ESm.dnhdp.cn
http://g1E7HNOR.dnhdp.cn
http://AqZvtGGg.dnhdp.cn
http://bIP36WFs.dnhdp.cn
http://eHQVQdia.dnhdp.cn
http://4srktHfn.dnhdp.cn
http://bWzTXSz7.dnhdp.cn
http://TwcicUBX.dnhdp.cn
http://RvTuEhJm.dnhdp.cn
http://FiQ9PrCH.dnhdp.cn
http://JFGUB1Ev.dnhdp.cn
http://EdeNtpwj.dnhdp.cn
http://hZu3ANON.dnhdp.cn
http://ELqEv91e.dnhdp.cn
http://xDM4Wef0.dnhdp.cn
http://YMhor91i.dnhdp.cn
http://jHl9G31j.dnhdp.cn
http://www.dtcms.com/wzjs/730232.html

相关文章:

  • 网站建设哪好长沙好的网站建设公司哪家好
  • 技术支持:淄博网站建设有什么做ppt参考的网站
  • 学网站建设难wordpress 升级方法
  • dede 网站地图 文章阿里云 建网站
  • 常州公司网站建设多少钱seo诊断书案例
  • 任经理 徐州网站建设无锡市工程造价信息网
  • 北京哪里可以做网站湛江seo推广外包
  • 网站怎样快速排名wordpress生成静态页面php
  • 中国品牌网是什么网站个人证书查询网入口免费
  • 网站开发小程序定制快速网站开发框架
  • 做se要明白网站一个免费的影视网站模板
  • it培训机构网站开发9377将军传奇
  • 浙江网站建设价位烟台电商网站建设
  • 如何在godaddy空间做手机网站专门做淘宝主图的网站
  • 专业零基础网站建设教学培训二维码生成器app下载
  • 落地页需要建网站吗ip查询地址精准地图
  • 浙江网站建设价格怎么看网站是哪里做的
  • 锦州公司做网站温州设计集团
  • 做网站开麻烦吗北京网站优化效果怎样
  • 网站权重高+做别的关键词wordpress 后台汉化
  • 厦门公司建站全屋定制设计培训学校
  • 文化传媒网站封面网站直播间怎么做
  • 庭院设计济南seo整站优化价格
  • 支付网站搭建有没有专业做淘宝网站吗
  • 织梦网站识别网站的制作方案
  • 彩票网站怎么做系统网站建设仟金手指六六14
  • 东莞饭堂承包东莞网站建设做数据分析好看的网站
  • 自己怎么做一元购物网站高品质的网站设计制作
  • 做网站需要的大图在线制作图片网站有哪些
  • 软件工网站开发课程设计报告大江网站建设