标签:通知 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
}
标签:通知 name value 监听 代理模式 设置 log 委托 int
原文地址:https://www.cnblogs.com/taobiao/p/10026452.html