我正在尝试使用委托的Kotlin属性实现JavaFX Property接口,以便可以这样使用它:
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)
}
但是,此类不实现接口的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)
}
但这似乎是一个糟糕的黑客攻击,并且在访问属性一次之前,它不会返回getBean()和getName()的正确值。有没有办法在不将它们传递给构造函数的情况下更早地获取这些值,就像SimpleObjectProperty所要求的那样?
答案 0 :(得分:2)
过去可以在Kotlin的预发布版本中使用,其中委托属性在委托属性的初始设置期间调用了另一个方法propertyDelegated()
。该方法在1.0之前不久被删除,但很可能在将来的版本中重新添加它(或等效功能)。
目前,我怀疑你现有的解决方案是最好的。
答案 1 :(得分:1)
在Kotlin 1.1中(从1.1-M04开始),您可以使用provideDelegate
运算符约定来定义在创建委托实例时将调用一次的函数。在您的示例中,您可以在provideDelegate
中声明PropertyFX
并返回一个新的委托,其中包含有关容器和属性的信息。更多信息:https://blog.jetbrains.com/kotlin/2016/12/kotlin-1-1-m04-is-here/#provide-delegate