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

来源:互联网 发布:淘宝投诉虚假发货 编辑:程序博客网 时间:2024/05/03 02:05

委托属性

简介

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

定义语法:

val/var <property name>: <Type> by <expression>
  • 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<BaseChannelgroup> by lazy {        val baseList = mutableListOf<BaseChannelgroup>()        dataList.forEach {            if (it.baseChannelgroupList.size > 0) {                baseList.add(it)                baseList.addAll(it.allShowedChildren)            } else {                baseList.add(it)            }        }        baseList    }    //调用list时,baseList即为list
0 0
原创粉丝点击