请解释 属性 代表
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。
我正在尝试学习 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。