【问题标题】:Getting KProperty Information from within Delegated Property outside getValue() and setValue() Functions从 getValue() 和 setValue() 函数之外的 Delegated Property 中获取 KProperty 信息
【发布时间】:2017-02-11 23:12:01
【问题描述】:

我正在尝试使用委托的 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)
    }

但这似乎是一个可怕的 hack,它不会返回正确的 getBean()getName() 值,直到该属性被访问一次。有没有办法在不将它们传递给构造函数的情况下提前获取这些值,就像SimpleObjectProperty 所要求的那样?

【问题讨论】:

    标签: javafx properties delegates kotlin


    【解决方案1】:

    这在 Kotlin 的预发布版本中曾经是可能的,其中委托属性在委托属性的初始设置期间调用了一个附加方法 propertyDelegated()。该方法在 1.0 之前不久被删除,但很可能会在未来的版本中重新添加它(或等效功能)。

    目前,我怀疑您现有的解决方案是最好的选择。

    【讨论】:

      【解决方案2】:

      在 Kotlin 1.1(自 1.1-M04 起)中,您可以使用 provideDelegate 运算符约定来定义一个函数,该函数将在创建委托实例时调用一次。在您的示例中,您可以在 PropertyFX 中声明 provideDelegate 并返回一个新委托,其中包含有关容器和属性的信息。更多信息:https://blog.jetbrains.com/kotlin/2016/12/kotlin-1-1-m04-is-here/#provide-delegate

      【讨论】:

        猜你喜欢
        • 2022-07-18
        • 1970-01-01
        • 1970-01-01
        • 2018-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多