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フィードバックを取得できます。ローカル設定は不要です。