Blocs init et ordre d’initialisation
Utilisez les blocs init et comprenez l’ordre d’initialisation des propriétés et des blocs.
Blocs init et ordre d’initialisation est une leçon Kotlin Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Kotlin Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Kotlin Academy comprend 4 leçons au total.
Qu’est-ce qu’un bloc init ?
Un bloc init { } contient le code qui s’exécute lorsqu’une instance est construite. Il fait partie de la logique du constructeur primaire.
Bloc init simple
Le bloc init s’exécute pendant la construction, après les initialiseurs de propriétés, dans l’ordre du code source.
class Logger(val name: String) {
init {
println("Constructed Logger("$name")")
}
}
fun main() {
val l = Logger("auth")
}Validation dans init
Utilisez require / check dans init pour imposer les invariants au moment de la construction.
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
}Plusieurs blocs init
Vous pouvez avoir plusieurs blocs init ; ils s’exécutent dans l’ordre du code source, entre les initialiseurs de propriétés.
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)
}Initialiseurs de propriétés et ordre d’init
Les initialiseurs de propriétés et les blocs init s’exécutent de haut en bas, dans l’ordre du code source. Une propriété doit être affectée avant d’être utilisée.
class Order {
val createdAt = System.currentTimeMillis()
init { println("created at $createdAt") }
val nextId = 1
init { println("next id = $nextId") }
}
fun main() {
Order()
}Impossible d’utiliser des propriétés avant leur initialisation
Référencer une propriété avant l’exécution de son initialiseur provoque une erreur de compilation.
class Bad {
init {
// println(name) // ERROR: name not yet initialized
}
val name = "after init"
}
fun main() { Bad() }Calculer des propriétés dérivées
Utilisez les blocs init pour calculer un état dérivé qui dépend de plusieurs paramètres du constructeur.
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
}Effets de bord : journalisation
Utilisez init pour les préparations non triviales, comme la journalisation, l’allocation ou l’enregistrement.
class Service(val name: String) {
init {
println("[BOOT] starting service '$name'")
}
}
fun main() {
Service("auth")
Service("payments")
}Ordre d’init avec les sous-classes
Le bloc init de la classe mère s’exécute avant celui de la sous-classe. Les propriétés propres à chaque classe sont initialisées dans l’ordre du code source.
open class Base {
init { println("Base init") }
}
class Sub : Base() {
init { println("Sub init") }
}
fun main() { Sub() }Éviter une logique lourde dans init
Les blocs init de longue durée ralentissent chaque construction. Envisagez une initialisation différée ou des méthodes fabrique si la préparation est coûteuse.
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
}Combiner init et les constructeurs secondaires
Les constructeurs secondaires délèguent au constructeur primaire ; les blocs init s’exécutent dans le cadre du chemin primaire.
class Box(val content: String) {
init { println("init for '$content'") }
constructor(): this("empty") { println("secondary done") }
}
fun main() {
Box()
}Vérification rapide
Dans quel ordre plusieurs blocs init et initialiseurs de propriétés s’exécutent-ils dans une classe Kotlin ?
Récapitulatif
Les blocs init contiennent la logique exécutée lors de la construction : validation, propriétés dérivées et effets de bord. Plusieurs blocs s’exécutent dans l’ordre du code source, entre les initialiseurs de propriétés. Évitez les opérations lourdes dans init ; utilisez plutôt lazy ou des méthodes fabrique.
Questions Fréquemment Posées
La leçon « Blocs init et ordre d’initialisation » est-elle gratuite ?
Oui — le texte complet de « Blocs init et ordre d’initialisation » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Kotlin Academy, passe à CoddyKit PRO. Le cours Kotlin Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Blocs init et ordre d’initialisation » ?
Utilisez les blocs init et comprenez l’ordre d’initialisation des propriétés et des blocs. Tu pratiques Kotlin Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Kotlin Academy ?
Aucune expérience préalable n'est requise. Kotlin Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Blocs init et ordre d’initialisation » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Kotlin Academy ?
Oui. Chaque leçon Kotlin Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Constructeur primaire et paramètres de propriétés
- Blocs init et ordre d’initialisation
- Accesseurs get et set personnalisés avec field
- lateinit et initialisation différée