Blocs init et validation
Fait partie de la section Programmation orientée objet du Journey Kotlin de Coddy. Leçon 4 sur 57.
Un bloc init s’exécute lorsqu’une instance est créée, juste après l’affectation des paramètres du constructeur. C’est l’endroit prévu pour le code d’initialisation qui ne tient pas dans une seule déclaration de propriété :
class Order(val id: Int, items: List<Int>) {
val total: Int
val count: Int
init {
total = items.sum()
count = items.size
println("created order $id")
}
}Dans main :
val o = Order(7, listOf(4, 6, 10))
println("${o.count} items, total ${o.total}")Sortie :
created order 7
3 items, total 20require(condition) { message } vérifie un argument et lève une IllegalArgumentException avec le message lorsque sa valeur est fausse. Le placer dans init signifie qu'une instance non valide ne peut jamais être créée :
class Percentage(val value: Int) {
init {
require(value in 0..100) { "percentage must be 0-100, was $value" }
}
}Dans main :
println(Percentage(42).value)
try {
Percentage(150)
} catch (e: IllegalArgumentException) {
println(e.message)
}Sortie :
42
percentage must be 0-100, was 150Une classe peut avoir plusieurs blocs init ; ils s’exécutent dans l’ordre, avec les initialisateurs de propriétés, de haut en bas :
class Demo(name: String) {
val first = "first: $name".also { println(it) }
init { println("init 1") }
val second = "second".also { println(it) }
init { println("init 2") }
}Dans main :
Demo("x")
println("done")Sortie :
first: x
init 1
second
init 2
doneLa validation dans init garde la règle à côté des données. Le code qui reçoit une instance peut lui faire confiance sans effectuer une nouvelle vérification :
class Email(val address: String) {
init {
require("@" in address) { "not an email: $address" }
}
}
fun send(to: Email) { /* pas besoin de vérifier l'adresse à nouveau */ }Défi
FacileComplétez la classe Password. Son bloc init vérifie, avec require, que le texte comporte au moins 8 caractères (message too short) et contient un chiffre (message needs a digit), dans cet ordre. La propriété strength est calculée dans init : strong lorsque le texte contient également une lettre majuscule, sinon ok.
Le code fourni crée un Password pour chaque ligne d’entrée et affiche strength ou le message d’erreur.
Votre code doit être placé dans Password.kt. Main.kt contient le code d’entrée/sortie fourni et ne peut pas être modifié.
Essayez vous-même
fun main() {
// Code d'entrée/sortie fourni : le garder tel quel
val input = generateSequence(::readLine).toList()
for (line in input) {
try {
println(Password(line).strength)
} catch (e: IllegalArgumentException) {
println(e.message)
}
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Classes et objets
Travailler avec des fichiersDéfinir des classesConstructeurs primairesBlocs init et validationConstructeurs secondairesRécapitulatif - Carte de bibliothèque4Héritage
Classes ouvertes et sous-classesRedéfinition des membressuper et constructeursClasses abstraitesRécapitulatif – Annuaire du personnel2Propriétés et encapsulation
Accesseurs personnalisésModificateurs de visibilitéSetters privéslazy et lateinitRécapitulatif - Compte bancaire5Interfaces
Déclarer des interfacesMéthodes par défautInterfaces multiplesInterfaces en tant que typesRécapitulatif - Méthodes de paiement8Génériques
Fonctions génériquesClasses génériquesContraintes de typeVariance avec in et outRécapitulatif - File de priorité11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livresEntraînez-vous par vous-même : Playground Kotlin