请解释 属性 代表

Please Explain Property Delegates

我正在尝试学习 Kotlin 和 TornadoFX。我一直看到的一件事是这样的代码:

val TextProperty = SimpleStringProperty()
var text by Textproperty

我一直在阅读文档

https://edvin.gitbooks.io/tornadofx-guide/content/part2/Property%20Delegates.html

所以我 "absorbed" 它们在模型中的值发生变化时很有用,但我需要进一步的帮助才能真正掌握这个概念。似乎有些东西没有被点击。有没有人有任何示例、视频等来证明这些 属性 代表的目的和用处?

一旦你可以写出类似

的东西
class C { var text by Textproperty }

全部c.text = blabla会编译成TextProperty.setValue(c, ::text, blabla)c.text会编译成TextProperty.getValue(c, ::text)。这使库(TextProperty 的提供者)能够接管 text.

上的操作

参考:https://kotlinlang.org/docs/reference/delegated-properties.html

这里的重点是 JavaFX 需要或至少更喜欢可观察的属性。您可以声明一种 JavaFX 属性 类型,而不是声明可变 属性,这取决于您想要的 属性 类型(String、Double、Int 等)。您真正需要的只是声明此 属性:

class Customer {
    val ageProperty = SimpleIntegerProperty()
}

你可以只用这个,不用任何委托。但是,如果你想改变这个 属性,你需要改变你定义的 属性 里面的 value 属性,所以代码看起来像这样:

customer.ageProperty.value = 42

这很麻烦,所以为了简单起见,您需要添加 getter 和 setter。手动执行此操作看起来像这样:

val ageProperty = SimpleIntegerProperty()
    var age: Int
        get() = ageProperty.value
        set(value) { ageProperty.value = value }

现在您可以像这样设置 Customer 的年龄:

customer.age = 42

这更方便,但您必须为每个 属性 声明所有代码,因此在 TornadoFX 中我们引入了 属性 委托,它通过一个简单的语句处理所有这些, 所以:

val ageProperty = SimpleIntegerProperty()
var age by ageProperty

最终结果是一样的,您无需执行任何繁重的工作。

需要说明的是,这解释了 属性 委托,而不是 JavaFX 属性有用的原因。 JavaFX 属性允许您绑定到 UI 元素,例如文本字段。对文本字段的更改将写回 属性,对 属性 的更改将写回 UI。