2017-08-21 13 views
5

私はAndroid上でkotlinをテストしており、最初に設定されたときに互いに変更しようとするため、infinte再帰で2つの変数のセッターが呼び出されるという問題が発生しました。それはinfinte再帰し、最終的にStackOverflowを引き起こしてしまいkotlin setter infinte recursion

val example = Example() 
example.a = 10 

:ここ

は、サンプルコード

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

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

そして、私は、次のコードを使用すると言っています。 bのセッターはaのセッターを呼び出すと、再びbのセッターが呼び出されます。それは永遠に続く。

私はaが設定されるたびbの値を更新するだけでなく、bが設定されるたびaの値を更新できるようにしたいです。

コトリンの専門家の意見はありますか?このケースでJavaをセッターのようにして、aまたはbに値を割り当てるたびにセッターコードが呼び出されないようにする必要がありますか?それとも、私が使うことができる素晴らしいコトリンの良さはありますか?

答えて

5

この例では、プロパティの1つだけを計算できます(例:

var a: Int = 0 

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

一般的に、Kotlinは他のプロパティのバッキングフィールドにアクセスすることはできません。手動で書き込む必要があります。

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は、決して使用されないため、これらのプロパティのバッキングフィールドを生成しません。