Menu
Coddy logo textTech

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 20

require(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 150

Une 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
done

La 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 */ }
challenge icon

Défi

Facile

Complé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)
        }
    }
}
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Playground Kotlin