2017-08-21 1 views
5

Ich teste out Kotlin auf Android und lief auf ein Problem, wo die Setter von zwei Variablen in einer unendlichen Rekursion aufgerufen werden, weil sie versuchen, einander zu ändern, wenn sie ursprünglich festgelegt sind.Kotlin Setter Infinte Rekursion

Hier ist ein Beispielcode

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

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

Und ich sage dann den folgenden Code verwenden:

val example = Example() 
example.a = 10 

Es endet eine infinte Rekursion verursachen und schließlich eine Stackoverflow. Der Setzer für b ruft den Setzer für a auf, der seinerseits den Setzer für b erneut aufruft. Und es geht für immer weiter.

Ich mag für b den Wert aktualisieren können, wann immer a eingestellt ist, sondern auch den Wert von a zu aktualisieren, wenn b gesetzt.

Irgendwelche Gedanken von den Kotlin-Experten da draußen? Müsste ich in diesem Fall Java-ähnliche Setter machen, so dass mein Setter-Code nicht aufgerufen wird, wenn ich a oder b einen Wert zuweise. Oder gibt es eine nette Kotlin-Güte, die ich benutzen kann?

Antwort

5

In diesem Beispiel könnten Sie nur eine der Eigenschaften berechnen, z.

var a: Int = 0 

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

Im Allgemeinen bietet Kotlin jedoch keinen Zugriff auf die Hintergrundfelder anderer Eigenschaften. Sie müssen es manuell schreiben, z.

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 nicht seine eigene Trägerfelder für diese Eigenschaften erzeugen, weil sie nie verwendet werden.

Verwandte Themen