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{}的运行过程
关于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()
}
}
}
这篇文章讲的蛮详细了:浅谈Kotlin(六):lateinit、by lazy 使用
简单的说:
lateinit
(延迟初始化属性)(只能用在var变量上),by lazy
只能用在val变量上。(不一定完全,待补充)