2017-08-21 14 views
5

Testuję kotlin na Androida i wpadłem w problem, w którym ustawia się zmienne dwóch zmiennych w rekursji infinte, ponieważ próbują się nawzajem zmieniać, gdy są pierwotnie ustawione.Seter kotek Infinte rekursji

Oto przykładowy kod

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

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

I powiedzieć, że następnie użyć następującego kodu:

val example = Example() 
example.a = 10 

kończy się powodując rekursji infinte i ostatecznie stackoverflow. Program ustawiający dla b wywołuje funkcję ustawiającą dla a, która z kolei ponownie wywołuje funkcję ustawiającą dla b. I trwa to na zawsze.

Chcę móc zaktualizować wartość dla b ilekroć a jest ustawiona, ale także zaktualizować wartość a ilekroć b jest ustawiony.

Jakieś myśli ekspertów od Kotlin? Czy w takim przypadku muszę ustawić język Java tak, aby mój kod ustawiający nie był wywoływany za każdym razem, gdy przypisuję wartość do a lub b. A może jest jakaś dobra dobroć Kotlina, której mogę użyć?

Odpowiedz

5

W tym przykładzie można obliczyć tylko jedną z właściwości, np.

var a: Int = 0 

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

Ogólnie rzecz biorąc, Kotlin nie zapewnia dostępu do pól wsparcia innych właściwości. Musisz napisać to ręcznie, np.

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 nie wygeneruje własnych pól wsparcia dla tych właściwości, ponieważ nie są one nigdy używane.