当我们拥有属性设置器时,`Delegates.observable`有什么用例?

kpt*_*cna 8 delegates kotlin

当我们可以使用属性设置器时,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)

  • 使用属性设置器也可以进行逻辑重用(尽管方式更有限)。关键区别在于 `Delegates.observable()` 提供对被观察的属性(和 oldValue)的访问。 (2认同)