我正在尝试实现 JavaFX Property与委托(delegate)的 Kotlin 属性接口(interface),以便可以像这样使用它:
class Foo(bar:Bar){
val barProperty=PropertyFX(bar)
var bar by barProperty
}
我为此写了一个小类(大部分):
class PropertyFX<T>(value:T):SimpleObjectProperty<T>(value),ReadWriteProperty<Any?,T>{
override fun getValue(thisRef:Any?,property:KProperty<*>)=get()
override fun setValue(thisRef:Any?,property:KProperty<*>,value:T)=set(value)
}
但是,这个类没有实现接口(interface)的 getBean() 和 getName() 方法。它们应该分别从 getValue() 和 setValue() 函数中引用的参数返回值 thisRef 和 property.name,但我无法从函数外部访问这些参数。
我可以在第一次使用它们时存储这些值,如下所示:
class PropertyFX<T>(value:T):SimpleObjectProperty<T>(value),ReadWriteProperty<Any?,T>{
private var bean:Any?=null
private var name=""
override fun getBean()=bean
override fun getName()=name
override fun getValue(thisRef:Any?,property:KProperty<*>):T{
bean=thisRef
name=property.name
return get()
}
override fun setValue(thisRef:Any?,property:KProperty<*>,value:T){
bean=thisRef
name=property.name
set(value)
}
但这似乎是一个可怕的 hack,它没有返回 getBean() 的正确值。和 getName()直到该属性被访问一次。有没有办法在不将它们传递给构造函数的情况下更早地获取这些值,就像 SimpleObjectProperty 所要求的那样?
最佳答案
这在 Kotlin 的预发布版本中曾经是可能的,其中委托(delegate)属性有一个额外的方法 propertyDelegated()
在委托(delegate)属性的初始设置期间调用。该方法在 1.0 之前不久被删除,但它(或等效功能)很可能会在 future 的版本中重新添加。
目前,我怀疑您现有的解决方案是最好的选择。
关于javafx - 从 getValue() 和 setValue() 函数之外的 Delegated Property 中获取 KProperty 信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36185885/