0Pricing
Kotlin Academy · レッスン

initブロックと初期化の順序

initブロックを使い、プロパティとブロックが初期化される順序を理解します。

「initブロックと初期化の順序」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

initブロックとは

init { }ブロックには、インスタンスの構築時に実行されるコードを記述します。これはプライマリコンストラクターの処理の一部です。

単純なinitブロック

initブロックは構築中に、ソースコードの順序に従ってプロパティ初期化子の後に実行されます。

class Logger(val name: String) {
    init {
        println("Constructed Logger("$name")")
    }
}
fun main() {
    val l = Logger("auth")
}

initでの検証

構築時に不変条件を適用するには、init内でrequire/checkを使用します。

class Percentage(val value: Int) {
    init {
        require(value in 0..100) { "value must be 0..100, was $value" }
    }
}
fun main() {
    println(Percentage(75).value)
    // Percentage(150) // throws IllegalArgumentException
}

複数のinitブロック

複数のinitブロックを定義できます。プロパティ初期化子と交互に、ソースコードの順序で実行されます。

class Demo(val x: Int) {
    init { println("First init, x=$x") }
    val doubled = x * 2
    init { println("Second init, doubled=$doubled") }
}
fun main() {
    Demo(5)
}

プロパティ初期化子とinitの順序

プロパティ初期化子とinitブロックは、ソースコードの順序に従って上から下へ実行されます。プロパティは使用する前に代入されていなければなりません。

class Order {
    val createdAt = System.currentTimeMillis()
    init { println("created at $createdAt") }
    val nextId = 1
    init { println("next id = $nextId") }
}
fun main() {
    Order()
}

初期化前のプロパティは使用できない

初期化子が実行される前にプロパティを参照すると、コンパイルエラーになります。

class Bad {
    init {
        // println(name) // ERROR: name not yet initialized
    }
    val name = "after init"
}
fun main() { Bad() }

派生プロパティの計算

複数のコンストラクターパラメーターに依存する派生状態を計算するには、initブロックを使用します。

class Rectangle(val width: Int, val height: Int) {
    val area: Int
    init {
        area = width * height
    }
}
fun main() {
    val r = Rectangle(4, 5)
    println("area = ${r.area}") // 20
}

副作用:ロギング

ロギング、確保、登録など、単純ではないセットアップにはinitを使用します。

class Service(val name: String) {
    init {
        println("[BOOT] starting service '$name'")
    }
}
fun main() {
    Service("auth")
    Service("payments")
}

サブクラスでのinitの順序

スーパークラスのinitはサブクラスのinitより先に実行されます。各クラス固有のプロパティは、ソースコードの順序で初期化されます。

open class Base {
    init { println("Base init") }
}
class Sub : Base() {
    init { println("Sub init") }
}
fun main() { Sub() }

initで重い処理を避ける

時間のかかるinitブロックは、構築のたびに処理を遅くします。セットアップにコストがかかる場合は、遅延初期化やファクトリーメソッドを検討してください。

class Heavy(val n: Int) {
    val data: List<Int> by lazy { (1..n).toList() }
}
fun main() {
    val h = Heavy(1_000_000)
    println("Created without computing data")
    println("First element: ${h.data[0]}") // now data initializes
}

initとセカンダリーコンストラクターの組み合わせ

セカンダリーコンストラクターはプライマリコンストラクターに委譲し、initブロックはプライマリコンストラクターの処理の一部として実行されます。

class Box(val content: String) {
    init { println("init for '$content'") }
    constructor(): this("empty") { println("secondary done") }
}
fun main() {
    Box()
}

確認問題

Kotlinクラスで複数のinitブロックとプロパティ初期化子は、どのような順序で実行されますか。

まとめ

initブロックには、検証、派生プロパティ、​副作用など、構築時のロジックを記述します。複数のブロックはプロパティ初期化子と交互に、ソースコードの順序で実行されます。initで重い処理を行うことは避け、代わりにlazyやファクトリーメソッドを使用してください。

よくある質問

「initブロックと初期化の順序」レッスンは無料ですか?

はい。「initブロックと初期化の順序」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「initブロックと初期化の順序」で何を学びますか?

initブロックを使い、プロパティとブロックが初期化される順序を理解します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「initブロックと初期化の順序」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. プライマリコンストラクターとプロパティパラメータ
  2. initブロックと初期化の順序
  3. fieldを使ったカスタムGetterとSetter
  4. lateinitと遅延初期化
← Kotlin Academyに戻る