2017-11-23 18 views
0

私は最近、initブロックを使用してコンストラクタで値を割り当てても、私の標準変数の値がデフォルトの値に置き換えられるという状況に遭遇しました。私がいた試した何Kotlinクラスの初期ブロック位置

class Example(function: Example.() -> Unit) { 

    init { 
     function() 
    } 

    var name = "default name" 

} 


// assigning it like this: 
val example = Example { name = "new name" } 

// print value 
print(example.name) // prints "default name" 

少し苦労した後、私は、initブロック事項の位置ということを発見しました。クラスの最後にinitブロックを置くと、最初にデフォルトの名前で初期化された後、function()が呼び出され、その値が「新しい名前」に置き換えられます。

最初に置くと名前が見つからず、プロパティが初期化されるときに "デフォルト名"に置き換えられます。

これは私にとっては奇妙なことです。なぜこれが起こったのか誰も説明できますか?

+1

クラスの初期化がトップダウンで正しい方法であると、initブロックが免除されていません。 –

+0

この練習はコトルの初期化を理解するだけでしたか?そうでない場合は、 'class Example(val name:String =" default name ")でこれを実現できます。 – Mikezx6r

+0

私のライブラリ(https://github.com/kirtan403/k4kotlin)でこれをやろうとしていましたが、それはトップに、全体の機能が壊れました。 – kirtan403

答えて

2

理由はkotlinが上下アプローチ文書から

An in-depth look at Kotlin’s initializers)初期化子(プロパティイニシャライザとinitブロック)、それらはクラスで定義された順序で実行され、トップ以下であります-to-bottom

複数のセカンダリコンストラクタを定義できますが、コンストラクタが別のコンストラクタを明示的に呼び出さない限り、クラスインスタンスを作成するときに1つだけ呼び出されます。

コンストラクタは、コンストラクタが呼び出されるたびに評価されるデフォルトの引数値を持つこともできます。プロパティの初期化子と同様に、これらは関数呼び出し、または任意のコードを実行するその他の式にすることができます。

初期化子は、クラスの主コンストラクタの先頭で上から下に実行されます。

これは

class Example(function: Example.() -> Unit) { 
var name = "default name" 
init { 
    function() 
} 
} 
+0

initブロックを一番下に置くのは、ほとんどの場合意味があるのでしょうか?特定のニーズがある場合を除き... – kirtan403

関連する問題