委托,是一种设计模式,又名代理。
语法:
val/var <属性名称>: <类型> by <表达式>
原理:
用 by
将变量的 set/get (val变量只有get) 委托给 by
关键字后面的表达式返回的对象的 setValue/getValue 函数
by 后面的被委托对象可以直接实现接口 ReadOnlyProperty
(对应val) ReadWriteProperty
(对应var), 由被代理对象操作的真实的数据
ReadOnlyProperty
public fun interface ReadOnlyProperty<in T, out V> {
public operator fun getValue(thisRef: T, property: KProperty<*>): V
}
ReadWriteProperty
public interface ReadWriteProperty<in T, V> : ReadOnlyProperty<T, V> {
public override operator fun getValue(thisRef: T, property: KProperty<*>): V
public operator fun setValue(thisRef: T, property: KProperty<*>, value: V)
}
使用 by
可以使用简化很多代码,提高内聚,降低耦合
lazy
作用: 延迟初始化, 几乎是用得最多吧
Delegates.notNull()
作用: 类似 lateinit var
, 但是 notNull
还可以用在基本类型
Delegates.observable(xxx)
作用: 提供可观察函数, 可以在变量值发生变化时, 对新旧值执行自己的操作
Delegates.vetoable(xxx)
作用: 实现的 beforeChange(xxx): Boolean
函数, 可以在变量值发生变化之前 执行自己的逻辑 根据返回值判断变量赋值是否生效