kotlin setter infinte recursión

Estoy probando kotlin en Android y me encontré con un problema donde los progtwigdores de dos variables son llamados en una recursión poco frecuente porque intentan cambiarse cuando están originalmente configurados.

Aquí hay un código de muestra

class Example { var a: Int = 0 set(value) { b = a+10 } var b:Int = 0 set(value) { a = b-10 } } 

Y digo que luego uso el siguiente código:

 val example = Example() example.a = 10 

Termina causando infinte recursiones y eventualmente un stackoverflow. El colocador para b llama al colocador por a que a su vez llama al colocador para b nuevo. Y continúa para siempre.

Quiero poder actualizar el valor de b siempre que se establezca a, pero también actualizo el valor de a cuando se establece b .

¿Alguna idea de los expertos de Kotlin? ¿Tendría que hacer que Java como setters en este caso para que mi código setter no se llame cada vez que asigno un valor a b ? ¿O hay alguna bondad ingeniosa de Kotlin que pueda usar?

Para este ejemplo, solo se puede calcular una de las properties, por ejemplo

 var a: Int = 0 var b: Int get() = 10 - a set(value) { a = 10 - value } 

En general, sin embargo, Kotlin no proporciona acceso a los campos de respaldo de otras properties. Tendrás que escribirlo manualmente, por ejemplo

 private var _a: Int = 0 var a: Int get() = _a set(value) { _a = value _b = 10 - value } private var _b: Int = 10 var b: Int get() = _b set(value) { _b = value _a = 10 - value } 

Kotlin no generará sus propios campos de respaldo para estas properties porque nunca se utilizan.

  • Notificaciones de Android que no se muestran en el emulador que ejecuta la API 27
  • El conflicto de las properties sintéticas de Kotlin
  • Evite que Kotlin fuerce a Java a ver un tipo de comodín
  • Restricción de generics Kotlin
  • Error de configuration automática del complemento kotlin-gradle
  • ¿Hay alguna forma de iterar todos los campos de una class de datos sin usar la reflexión?
  • Kotlin: utilizando los methods estáticos de google-guava como extensiones
  • Prueba de unidades de Mockito: en todas las invocaciones de methods de una class, devuelve "verdadero"