码迷,mamicode.com
首页 > 其他好文 > 详细

kotlin-代理属性(by)

时间:2018-11-27 17:06:03      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:通知   name   value   监听   代理模式   设置   log   委托   int   

归纳自: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)

标签:通知   name   value   监听   代理模式   设置   log   委托   int   

原文地址:https://www.cnblogs.com/taobiao/p/10026452.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!