从Delegated属性中获取KProperty信息getValue()和setValue()函数

时间:2016-03-23 18:21:58

标签: javafx properties delegates kotlin

我正在尝试使用委托的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所要求的那样?

2 个答案:

答案 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