关于Kotlin中,lazy加载数据问题


#1

问大家一个关于kotlin中lazy的使用问题,一般这么用:
image

我想知道,它是如何延时加载到数据的,看源码这块不是很明朗,有没有对这块研究比较深的?


#2

你都已经看到源码了,这还有什么不明朗的…


#3

lazy也是一个代理,返回一个Lazy的子类,一般我们常用代理属性都是重写operator fun getValue的方法。而Kotlin的方式是扩展了一个getValue( thisRef: Any?, property: KProperty<*>)的方法,而不是在类里面重写getValue方法。
底层原理不清楚,但是代理的属性都会调用getValue方法,这个时候调用Lazy的扩展方法getValue,然后返回Lazy内部的value属性,访问value的时候调用get()方法,就是你截图里的代码了。synchronized是为了防止多线程访问同一个变量出错的问题


#4

懒加载会生成一个Lazy实例化对象,Lazy对象中会有个和声明的Lazy泛型类型相同的成员变量_value。第一次访问s的时候会调用这个Lazy对象的getValue方法。getValue会判断_value是否为null , 如果_value为null就会调用声明中lambda中的代码({intent.getStringExtra(“test”)})给_value赋值并返回。第二次访问的时候同样判断_value,这个时候_value已经有值了,所以直接返回。所以lazy只会初始化一次值并且不会改变,就相当于一个懒汉式的单例实现


京ICP备16022265号-2 Kotlin China 2017 - 2018