kotlin的by lazy

平时哪里用到了?

   private val pageAdapter by lazy { PagerAdapter(this@MainActivity) }
   
   private val alarmFragment by lazy { AlarmFragment() }
   private val timerFragment by lazy { TimerFragment() }

官网上怎么描述的?

https://kotlinlang.org/docs/idioms.html#lazy-property
kotlin中文站:习惯用法
如下图:by lazy属于习语(idioms),从注释可以看出:变量只在第一次被访问时被加载。

by lazy只能作用于val关键字标注的属性。
当属性用到的时候才会初始化”lazy{}”里面的内容
而且再次调用属性的时候,只会得到结果,而不会再次执行lazy{}的运行过程

和java的单例模式有关系吗?

关于kotlin的单例模式,这篇文章讲的非常清楚:205赞:Kotlin下的5种单例模式
多数情况下,by lazy修饰的val变量都是单例的,因为by lazy{}里面的代码只执行一次。可以验证下:

class SingleTonTest {
    val name: String = "zhangjin"
}

fun main(args: Array<String>) {
    val s: SingleTonTest by lazy {
        println("s初始化")
        SingleTonTest()
    }
    for (i in 0 until 5) {
        println(s.name)
    }
}

在这里插入图片描述

此外,by lazy与双重校验锁单例模式有关系。把代码列出如下:

class SingletonDemo private constructor() {
    companion object {
        val instance: SingletonDemo by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
        	SingletonDemo() 
        }
    }
}

用by lazy修饰的目的是什么?

这篇文章讲的蛮详细了:浅谈Kotlin(六):lateinit、by lazy 使用
简单的说:

  1. by lazy 想达到一个目的,变量只做声明,被调用的时候再初始化。
  2. 只被初始化一次。

和lateinit的区别是什么?

lateinit(延迟初始化属性)(只能用在var变量上),by lazy只能用在val变量上。(不一定完全,待补充)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangjin1120

可靠的文章费时费力,希望支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值