当我们可以使用属性设置器时,Delegates.observable的用例是什么?
var foo by Delegates.observable("hell0") { prop, old, new ->
// react to changes in foo
}
var bar = "hello"
set(value) {
field = value
// react to changes in bar
// we can also do validation, set something like `value*2` to field, etc.
}
Run Code Online (Sandbox Code Playgroud)
hot*_*key 10
如果您希望多个属性以相同的方式响应修改,则属性设置器需要更多的代码重复:
var foo: Foo = Foo()
set(value) {
println("foo = $value")
field = value
}
var bar: Bar = Bar()
set(value) {
println("bar = $value")
field = value
}
Run Code Online (Sandbox Code Playgroud)
反过来,代表的目的是允许重用属性访问器逻辑,如下所示:
fun <T> printDelegate(init: T) =
Delegates.observable(init) { prop, _, new ->
println("${prop.name} = $new")
}
val foo: Foo by printDelegate(Foo())
val bar: Bar by printDelegate(Bar())
Run Code Online (Sandbox Code Playgroud)