Delegated Properties我姑且将其称为委托属性,因为实在不知道怎么翻译好,委托属性是一类特殊的Kotlin属性,先来看看最基本的委托属性。

class Dog1 {var name: String by Owner()
}class Owner {private var mDogName: String = ""operator fun getValue(dog: Dog1, property: KProperty<*>): String {return mDogName}operator fun  setValue(dog: Dog1, property: KProperty<*>, s: String) {mDogName = s}
}

上面的例子中,我们定义了一个Dog类,其内有一个name属性,该属性使用了by关键字,将name属性委托给了Owner类,如果觉得抽象,可以这样理解,Dog有一个name属性,但是该属性的getter和setter则交给了另外一个类来负责实现,也就是说name属性的命运是由其他类来控制的,并非Dog类自己。

Owner类作为Dog类的name属性的被委托类,需要实现getValue和setValue两个operator方法,Kotlin通过operator方法指定一种运算,这里还涉及运算符重载,不再赘述。需要注意的是不要在getValue方法中使用dog.name,这样会出现上一篇文章中的无限递归调用。

上面就是Kotlin的委托属性,Kotlin官方文档给出了一个不错的概括:

1.对于只读属性(如val属性), 委托必须实现getValue方法,该方法的参数如下:

thisRef — 必须和属性所有者类型相同或者是属性所有者类型的超类,如上面的dog:Dog
property — 必须是KProperty<*>类型或者KProperty<*> 的超类
返回值——getValue方法必须返回和属性类型相同类型的返回值

2.对于可变属性(如var属性),委托必须实现setValue方法,该方法的参数如下:

thisRef — 与getValue相同
property — 与getValue相同

new value — 必须和属性相同类型或者是属性类型的超类

了解了委托属性的概念,Kotlin提供了几种现成的委托形式,先来看看懒加载属性。

class Dog2 {val name: String by lazy {println("First time call me")"Bebe"}
}

懒加载属性使用by lazy后跟lambda表达式的形式,lambda表达式内的代码只会在第一次获取属性值时被执行,之后不再执行,例如

val dog2 = Dog2()
println(dog2.name)
println(dog2.name)

输出结果为:

First time call me
Bebe
Bebe

下面看看可观察属性

class Dog3 {var name: String by Delegates.observable("Bebe") {prop, old, new ->println("My name changes from $old to $new")}
}

使用by Delegates.observable定义可观察属性,有两个参数,第一个参数是属性的默认值,第二个参数是一个高阶函数,该函数在属性被赋值后将被调用,我们可以做一些观测。下面是调用代码

val dog3 = Dog3()
println(dog3.name)
dog3.name = "BEBE"
println(dog3.name)

输出为

Bebe
My name changes from Bebe to BEBE
BEBE

另外还有一个Delegates.vetoable是在属性被赋值前被调用,这里不再赘述,感兴趣可以试试。

最后的一种委托属性可以帮助我们使用Map对常量属性进行初始化,Kotlin文档中介绍,这种委托主要适用于将JSON的数据组织为Map形式,然后初始化数据。

class Dog4(initValues: Map<String, String>) {val name by initValues
}

调用时

val dog4 = Dog4(mapOf("name" to "Bebe"))
println(dog4.name)

Map的key是属性的名称,value是赋值给属性的值。

Kotlin笔记(七)——委托属性(Delegated Properties)相关推荐

  1. Kotlin-20.代理/委托属性(delegated properties)

    官方文档: http://kotlinlang.org/docs/reference/delegated-properties.html 1.委托属性 一些常见的属性类型:懒加载属性(lazy pro ...

  2. Kotlin学习笔记 第二章 类与对象 第十四 十五节 委托 委托属性

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  3. kotlin学习笔记——委托属性

    委托属性 kotlin提供了将属性委托到一个类的方法,就是委托属性. 当我们使用属性的get和set方法时,属性委托的getValue和setValue就会被调用. 属性委托的结构如下: class ...

  4. Kotlin笔记7-Delegation 和 Delegated Properties

    一.Delegation 类的代理 代理模式被证明是实现继承的一个很好替代方案,代理模式使得我们可以用聚合来替代继承,将代理和真实实现分离开来,以达成解耦的目的. Kotlin对代理模式内置支持,且零 ...

  5. Kotlin 知识梳理(9) 委托属性

    一.本文概要 本文是对<<Kotlin in Action>>的学习笔记,如果需要运行相应的代码可以访问在线环境 try.kotlinlang.org,这部分的思维导图为: 二 ...

  6. Kotlin Delegated Properties

    Delegated Properties,代理属性.顾名思义,就是我们在同这一个属性进行交互的时候并不操作属性本身,而是操作属性的代理类对象. 如果一个属性被按照以下的句法写成: val/var &l ...

  7. Java笔记整理六(File类,递归,字节流IO,字符流IO,流中的异常处理,属性集Properties,缓冲流,转换流,序列化,打印流)

    1.File类 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 文件和目录路径名的抽象表示 java把文件和文件夹封装位为一个File类,我们可 ...

  8. ROS学习笔记七:使用rqt_console和roslaunch

    ROS学习笔记七:使用rqt_console和roslaunch 本节主要介绍在调试时使用的rqt_console和rqt_logger_level,以及一次性打开多个节点的工具roslaunch. ...

  9. RISC-V IDE MRS使用笔记(七) :常用开发技巧汇总

    RISC-V IDE MRS使用笔记(七) :常用开发技巧汇总 Q1: MRS调试时如何查看外设寄存器内容? A1: 在调试配置界面添加相应的.svd文件. Q2: MRS如何调用数学库? A2: # ...

最新文章

  1. UVA 818 Cutting Chains(状压 + 暴搜)题解
  2. 1.windows网络配置无法上网
  3. 太阳表面是怎样的呢?
  4. org.activiti.engine.ActivitiException: Couldn't deserialize object in variable 'application'
  5. modnet是一个无需绿幕,扣人像,笔记本上跑到10-20帧
  6. 源码时代php中级项目,PHP学科项目评比圆满结束
  7. 机器学习理论《统计学习方法》学习笔记:第九章 EM算法及其推广
  8. 直接说,我要怎样才能做到年薪 50 万?
  9. 【转载】TCP拥塞控制算法 优缺点 适用环境 性能分析
  10. linux多个文件打包命令行,linux命令五十七之tar命令;linux多个文件压缩打包到一个压缩文件...
  11. Linux下java进程CPU占用率高分析方法
  12. acrobat xi pro 简体中文语言支持包_在朋友圈收表情包收到手软?预感下一个好玩的功能会是它...
  13. 用于温度测量的热敏电阻
  14. WPS表格 JSA 学习笔记
  15. 2019/12/9 K60单片机学习
  16. 支付宝第三方登录接口 php,PHP调用支付宝支付接口操作步骤
  17. 高速公路收费站通行能力分析与设计
  18. 汉诺塔游戏c语言作业,C语言实现汉诺塔游戏.pdf
  19. springboot二手车交易系统毕业设计源码131456
  20. 【JY】基于性能的抗震设计浅析(一)

热门文章

  1. matlab中mean函数的用法
  2. 面料跟单与服装跟单流程
  3. 人类视觉系统(Human Visual System,HVS)
  4. 模具管理系统解决哪方面的问题?模具管理系统需求分析介绍
  5. 流水线技术与并行技术
  6. Point-to-Voxel Knowledge Distillation for LiDAR Semantic Segmentation 论文阅读CVPR2022
  7. 人人都有机会成为电影主角?数字分身技术如何赋能元宇宙电影?
  8. 窗体应用程序防腾讯QQ源码
  9. mysql 索引 unique_MySQL UNIQUE索引
  10. PMD笔记-Overridable method 'XXX' called during object construction