- 什么是懒委托呢?大家知道单例模式中的懒汉式吧?这个跟它差不多,只不过我们不需要写静态方法和锁机制了,只需要像下面这样写:
val temp: String by lazy {
println("测试变量初始化了")
return@lazy "666666"
}
- 调用代码如下:
println("测试开始")
println("测试第一次输出 " + temp)
println("测试第二次输出 " + temp)
println("测试结束")
- 输出日志如下:
System.out: 测试开始
System.out: 测试变量初始化了
System.out: 测试第一次输出 666666
System.out: 测试第二次输出 666666
System.out: 测试结束
- 是不是真的跟懒汉式差不多?只不过这种写法简化了很多,另外在日常开发中我们可以用它来做
findViewById是最适合不过的。
private val viewPager: ViewPager? by lazy { findViewById(R.id.vp_home_pager) }
-
另外懒委托还提供了几种懒加载模式供我们选择,
- LazyThreadSafetyMode.SYNCHRONIZED:同步模式,确保只有单个线程可以初始化实例,这种模式下初始化时线程安全的,当
by lazy没有指定模式的时候,就是默认用的这种模式。 - LazyThreadSafetyMode.PUBLICATION:并发模式,在多线程下允许并发初始化,但是只有第一个返回的值作为实例,这种模式下是线程安全的,和
LazyThreadSafetyMode.SYNCHRONIZED最大区别是,这种模式在多线程并发访问下初始化效率是最高的,本质上面是用空间换时间,哪个的线程执行快就让哪个先返回结果,其他线程执行的结果抛弃掉。 - LazyThreadSafetyMode.NONE:普通模式,这种模式不会使用锁来限制多线程访问,所以是线程不安全的,所以请勿在多线程并发的情况下使用。
- LazyThreadSafetyMode.SYNCHRONIZED:同步模式,确保只有单个线程可以初始化实例,这种模式下初始化时线程安全的,当
-
具体使用的方式也很简单,如下:
val temp: String by lazy(LazyThreadSafetyMode.NONE) {
println("测试变量初始化了")
return@lazy "666666"
}
-
另外有一点需要注意,使用懒委托的变量必须声明为 val(不可变的),因为它只能被赋值一次。