原文链接

一文彻底搞懂Kotlin中的委托

在kotlin中,从用法上来说委托有以下类型:

  • 类委托
  • 属性委托
  • 标准库提供的委托

实际上标准库提供的委托就是kotlin帮我们实现好一些的属性委托。

类委托

类委托有三个对象:

  1. 定义业务方法的接口
  2. 实现接口的委托对象
  3. 实现接口的被委托对象

当委托对象委托给被委托对象时(koltin中通过 by 修饰),调用委托对象中实现了的接口相关方法,将由被委托对象代为处理。

类委托可以看成是一种实现继承的快捷方式,委托对象相当于父类,而被委托对象相当于这个父类的子类,当委托对象委托给被委托对象时,就相当于把子类实例赋值给父类对象,这时候调用父类中的方法会调用子类实例实现的方法。

属性委托

有一些常见的属性类型,我们可能会在每次需要的时候重复手动实现,对于这种场景可以使用属性委托

  1. class Test {
  2. // 属性委托
  3. var prop: String by Delegate()
  4. }

属性委托的语法

  1. val/var <属性名>: <类型> by <表达式>

属性委托和类委托的区别在于,委托角色从委托对象变成了委托属性,被代理的逻辑变成了这个属性的 get/set 方法,即被委托类仅仅是覆盖这个属性的 get/set 方法。

Kotlin 标准库中声明了2个含所需 operator方法的 ReadOnlyProperty / ReadWriteProperty 接口。

  1. interface ReadOnlyProperty<in R, out T> {
  2. operator fun getValue(thisRef: R, property: KProperty<*>): T
  3. }
  4. interface ReadWriteProperty<in R, T> {
  5. operator fun getValue(thisRef: R, property: KProperty<*>): T
  6. operator fun setValue(thisRef: R, property: KProperty<*>, value: T)
  7. }

如果想快速实现属性委托,可以继承上面接口自定义类实现。

kotlin 标准库中提供几个委托

  • 延迟属性
  • 可观察属性
  • 把多个属性存储到一个映射(map)中,而不是每个存在单独的字段中。