Obtención de información de KProperty dentro de la propiedad delegada fuera de las funciones getValue () y setValue ()

Estoy tratando de implementar la interfaz de propiedad JavaFX con una propiedad delegada de Kotlin, para que pueda usarse así:

class Foo(bar:Bar){ val barProperty=PropertyFX(bar) var bar by barProperty } 

Escribí una class pequeña para esto que funciona (principalmente):

 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) } 

Sin embargo, esta class no implementa los methods getBean () y getName () de la interfaz. Deberían devolver los valores thisRef y property.name, respectivamente, de los arguments a los que se hace reference en las funciones getValue () y setValue (), pero no tengo acceso a esos arguments desde fuera de las funciones.

Pude almacenar los valores la primera vez que los usé, así:

 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) } 

Pero esto parece un hack horrible, y no devuelve los valores correctos para getBean () y getName () hasta que se acceda a la propiedad una vez. ¿Hay alguna forma de get estos valores antes sin pasarlos al constructor, como lo requiere SimpleObjectProperty ?

En Kotlin 1.1 (desde 1.1-M04), puede usar la convención de operador provideDelegate para definir una function a la que se llamará una vez cuando se cree la instancia del delegado. En su ejemplo, puede declarar provideDelegate en PropertyFX y devolver un nuevo delegado con la información sobre el contenedor y la propiedad. Más información: https://blog.jetbrains.com/kotlin/2016/12/kotlin-1-1-m04-is-here/#provide-delegate

Esto solía ser posible en las versiones preliminares de Kotlin, donde las properties delegadas tenían un método adicional llamado propertyDelegated() durante la configuration inicial de una propiedad delegada. El método fue eliminado poco antes de 1.0, pero es probable que se vuelva a agregar (o una característica equivalente) en una versión futura.

Por ahora, sospecho que su solución actual es la mejor posibilidad.

  • Kotlin getter setter sin campo
  • Alias ​​en línea para la function de Kotlin que incluye generics
  • ¿Cómo implementar una propiedad que proviene de una fuente determinada hasta que se establece directamente en Kotlin?
  • ¿Por qué el código que inicializa una propiedad de interfaz variable no se codificará en la compilation del bloque init?
  • Delegado de propiedad de acceso en Kotlin
  • Property setter con diferente tipo
  • Kotlin: ¿cómo hacer una propiedad delegada por map con un nombre personalizado?
  • No se puede usar getter personalizado con propiedad delegada
  • Al crear una interfaz en Kotlin, ¿importa si las properties tienen get / set?
  • Kotlin delegar propiedad por perezoso que es hilo local
  • Kotlin: ¿Cómo puedo evitar el autoboxing (basura) en las properties delegadas?