私はKotlinのクラスの初期化について説明している言語定義の何も見つけることができませんでした。Kotlinクラスの初期化セマンティクスとは何ですか?
import java.util.Properties
fun main(args: Array<String>) {
val out = MyClass()
out.fn()
}
class MyClass {
private val a = Properties() // 1
init {
fn()
}
public fun fn() {
println("Fn called. a = $a")
}
// private val a = Properties() // 2
}
このプログラムの実行結果は、プロパティが(1)または(2)で初期化されているかどうかによって変わります。
宣言の順序は言語に関連しており、この背後にある決定を理解したいと思っています。私の期待は、コンストラクタ本体が呼び出される前にプロパティが初期化されることです。
これは完全に正しいわけではありません。 'init'ブロックには、プライマリコンストラクタに含まれるコードが含まれています。あなたの例では、セカンダリコンストラクタが ':this(0)'構文を使ってプライマリコンストラクタに委譲するため、それらは実行されます。二次コンストラクタが一次コンストラクタに委譲しない場合、そのコンストラクタを使用してクラスが初期化されるときに 'init'ブロックは実行されません。 – yole
こんにちはAga/Yole - あなたの答えに感謝します。私はおそらく私がKotlin n00bだと言っていたはずですが、それはおそらく私の質問からはっきりしています。 あなたの回答はどちらも言語に精通していると思います。 "プライマリコンストラクタにはコードを入れることはできません。初期化コードは初期化ブロックに置くことができます先頭に「init」キーワードが付いています。 ただし、初期化の順序については何も記載されていません。 (私が見ることができる) –
@yole明確化のために感謝します。:) – aga