存在一些常见共用的属性,虽然我们可以在需要时手动实现它们,但一劳永逸地实现并放入库中将非常棒。例子包括:
- 懒属性:该值仅在第一次访问时计算
- 可观察的属性:该属性变化的时候,观察者将收到通知
- 在map中存储属性,而不是每个属性单独一个字段
为了涵盖这些(和其他)情况,Kotlin支持委托属性:
class Example {
var p: String by Delegate()
}
语法是:val/var <property name>: <Type> by <expression>
。by语句之后的表达式是代理,因为与属性对应的get()(和set())将被委派给它的getValue()和setValue()方法。属性代理不必实现任何接口,但是它们必须为var提供一个getValue()函数(和setValue())。 例如:
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, thank you for delegating '${property.name}' to me!"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$value has been assigned to '${property.name} in $thisRef.'")
}
}
由于知识储备不够,暂时理解不了,待合适的机会继续翻译...