kotlin的by lazy

Posted zhangjin1120

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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变量上。(不一定完全,待补充)

以上是关于kotlin的by lazy的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin基础 关键字:lateinit和by lazy

Kotlin -by 详解

Kotlin -by 详解

lateinit by lazy

使用“by lazy”与“lateinit”进行属性初始化

Kotlin Vocabulary | Kotlin 内建代理