Accediendo al campo de una instancia diferente de la misma class en Kotlin

Considera este código de Kotlin:

var parent: T? = null get() = if (isParent) this as T else field set(value) { field = if (value == null) null else value.parent } val isParent: Boolean get() = parent == null var description = "" get() = if (isParent) field else parent!!.description set(value) { if (isParent) field = value else parent!!.description = value } 

Suponga que isParent devuelve true si esta instancia es una instancia parent . Si no, getParent() devolverá la instancia principal. En Java, puedes acceder directamente al campo de una instancia diferente de la misma class, como esta:

 String getDescription() { return getParent().description; } void setDescription(String value) { getParent().description = value; } 

(No digo que sea lo mejor que puedo hacer, lo simplifiqué para la demostración). Comparando con Java, sería bueno poder hacer lo siguiente:

 var description = "" get() = parent.field set(value) { parent.field = value } 

Sin embargo, esto no funciona y, lamentablemente, hace que el código sea less legible. Especialmente si tiene muchas de esas variables, que están vinculadas a este elemento parent .

Solo se puede acceder a un campo de respaldo de una propiedad desde un getter o setter de esa propiedad, y solo para la instancia en la que se ha invocado el getter o setter. Si necesita proporcionar múltiples forms de acceder a un atributo de una class, necesita definir dos properties distintas, una de las cuales tiene un campo de respaldo para almacenar los datos y otra tiene un getter y un setter que hacen reference a la primera propiedad.

 class Foo { var parent: Foo? = null val parentOrSelf: Foo get() = parent ?: this private var _description: String? = null var description = "" get() = parentOrSelf._description set(value) { parentOrSelf._description = value } } 
  • Implementación de interfaz de retorno con Kotlin y lambda
  • Dibuja una línea en el canvas lentamente como una animation
  • Función de extensión booleana
  • Respuesta fragmentada de Vert.x con los datos de la database usando BLOB e hibernación
  • Gradle KTS. ¿Cómo mover la configuration de dependencies a un file separado de la compilation principal?
  • Kotlin: onGlobalLayout no se llama
  • Cómo express `Class <? extiende Any> `
  • Argumentos pnetworkingeterminados de Kotlin en error de interfaz?
  • Utilice el grupo en RestricciónDeLiminación para escuchar los events de clics en varias vistas
  • ¿Cómo hacer un grupo? ¿Por qué coleccionar usando RxJava y Kotlin?
  • dsl dynamic usando kotlin con asistencia de contenido