Kotlin随笔 委托属性之延迟加载

委托属性

简介

1、委托属性,就是对其属性值的操作不再依赖于其自身的getter()/setter()方法,是将其托付给一个代理类。
2、当我们使用属性的get或者set的时候,属性委托的getValue和setValue就会被调用。

定义语法:

val/var <property name>: <Type> by 
  • var/val:属性类型(可变/只读)
  • name:属性名称
  • Type:属性的数据类型
  • expression:代理类
  • by关键字之后的表达式就是委托,属性的get()方法(以及set() 方法)将被委托给这个对象的 getValue()和setValue()方法.属性委托不必实现任何接口, 但必须提供 getValue() 函数(对于 var属性,还需要 setValue() 函数)。

lazy:延迟加载

1、 lazy提供了初始化的方法,不过真正初始化这个动作发生的时机却是在第一次被使用时。
2、 lazy()是一个函数, 可接受一个Lambda表达式作为参数,第一次调用将会执行 Lambda 表达式,以后调用该参数返回以前记住的结果.
3、 可以理解为lazy{…}函数的最后一行为返回值
4、 lazy只能实现对属性为val的初始化,对于var需要用lateinit
5、 lateinit的使用有很多限制的,比如只能在不可null的对象上使用,不能为primitives(Int、Float之类)等等

eg1、最后一行为返回值

val str: String by lazy{
    "jane"
    "marry"
    "jake"
}
fun main(args: Array<String>) {
    println(str)
}
/* 输出:
 * jake
 */

eg2、第一次调用执行lazy()中的lambda表达式,并返回值;以后调用直接返回记录的值

val lazyValue: String by lazy {
    println("computed!")
    "Hello"
}
fun main(args: Array<String>) {
    println(lazyValue)
    println(lazyValue)
}
/* 输出:
 * computed
 * Hello
 * Hello
 */

eg3、

 val list: MutableList by lazy {
        val baseList = mutableListOf()
        dataList.forEach {
            if (it.baseChannelgroupList.size > 0) {
                baseList.add(it)
                baseList.addAll(it.allShowedChildren)
            } else {
                baseList.add(it)
            }
        }
        baseList
    }
    //调用list时,baseList即为list

你可能感兴趣的:(Kotlin)