kotlin-代理属性(by)

Posted taobiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kotlin-代理属性(by)相关的知识,希望对你有一定的参考价值。

归纳自:https://blog.csdn.net/IO_Field/article/details/53374809

代理模式
客户端使用一个代理对象实现对真实对象的访问,代理对象和真实对象实现相同的接口,代理对象持有真实对象

Kotlin-代理属性(by)
Kotlin中,委托的实现依靠于关键字 by ,by表示将实现接口的真实对象(by后边的实例)保存在代理对象的内部,比如SportsManager类继承于ISports接口,并可以ISports接口的所有的 public 方法委托给一个指定的对象。
interface ISports {
  fun doSports()
}

class SwimForSports: ISports{
override fun doSports() {
  println("do swim")
}
}

class SportsManager(sport: ISports): ISports by sport

fun main(args: Array<String>) {
  val swimSports: SwimForSports = SwimForSports()
  SportsManager(swimSports).doSports()// Log:do swim
}
在SportsManager声明中,by子句表示,将sport保存在SportsManager的对象实例内部,而且编译器将会生成继承自 ISports 接口的所有方法, 并将调用转发给sport

委托属性
by关键字之后的表达式就是委托,属性的get()方法(以及set() 方法)将被委托给这个对象的 getValue()和setValue()方法.属性委托不必实现任何接口, 但必须提供 getValue() 函数(对于 var属性,还需要 setValue() 函数)
by lazy :
延迟加载属性(lazy property): 属性值只在初次访问时才会计算。var类型属性不能设置为延迟加载属性,因为在lazy中并没有setValue(…)方法
val no: Int by lazy {
  200
}
by Delegates.(...)
可观察属性(observable property): 属性发生变化时, 可以向监听器发送通知
Delegates.observable
Delegates.vetoable
Delegates.notNull()
将多个属性保存在一个 map 内, 而不是保存在多个独立的域内
class User(val map: Map<String, Any?>) {
  val name: String by map
  val age: Int by map
}






























以上是关于kotlin-代理属性(by)的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin -by 详解

kotlin属性代理

Kotlin Vocabulary | Kotlin 内建代理

将 Kotlin 属性委托与 by 一起使用时出现 NullPointerException (NPE)

kotlin中委托的概念和原理

Android筑基——Kotlin by 关键字详解