从Delegate属性的getValue()和setValue()函数外部获取KProperty信息
我试图用委托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所要求的那样 ?
在Kotlin 1.1(自1.1-M04开始)中,可以使用provideDelegate
运算符约定来定义一个函数,当创建委托的实例时,该函数将被调用一次。 在你的例子中,你可以在PropertyFX
声明provideDelegate
,并返回一个新的委托与容器和属性的信息。 更多信息: https : //blog.jetbrains.com/kotlin/2016/12/kotlin-1-1-m04-is-here/#provide-delegate
这在Kotlin的预发布版本中是可行的,在委托属性的初始设置期间,委托属性具有额外的方法propertyDelegated()
。 这个方法在1.0之前被删除,但是它可能会在未来的版本中被重新添加(或者等价的特性)。
现在,我怀疑你现有的解决方案是最好的可能性。