Menu
Coddy logo textTech

Classes de données

Fait partie de la section Programmation orientée objet du Journey Kotlin de Coddy. Leçon 32 sur 57.

Une classe de données est une classe dont le rôle principal est de contenir des données. Le modificateur data permet au compilateur de générer toString(), equals(), hashCode(), copy() et componentN() à partir des propriétés du constructeur primaire :

data class Point(val x: Int, val y: Int)

Dans main :

val a = Point(1, 2)
val b = Point(1, 2)
println(a)
println(a == b)
println(setOf(a, b).size)

Sortie :

Point(x=1, y=2)
true
1

Sans data, println affiche le nom de la classe et un code de hachage tel que Point@1b6d3586, et deux objets ayant les mêmes valeurs ne sont pas égaux. copy() crée un nouvel objet dont certaines propriétés sont modifiées et laisse l’original tel quel, de sorte qu’une classe de données dont les propriétés sont en val fonctionne comme une valeur immuable :

data class User(val name: String, val email: String, val admin: Boolean = false)

Dans main :

val ada = User("Ada", "ada@example.com")
val boss = ada.copy(admin = true)
println(ada)
println(boss)
println(ada == boss)

Sortie :

User(name=Ada, email=ada@example.com, admin=false)
User(name=Ada, email=ada@example.com, admin=true)
false

Les déclarations de déstructuration décomposent un objet en variables : val (x, y) = point appelle les component1() et component2() générés, dans l’ordre du constructeur. Cela fonctionne également dans les boucles for et les paramètres de lambda, et _ permet d’ignorer une propriété :

data class Score(val player: String, val points: Int, val level: Int)

Dans main :

val scores = listOf(Score("ada", 120, 3), Score("bo", 95, 2))
for ((player, points) in scores) println("$player: $points")
val (_, bestPoints, bestLevel) = scores.maxBy { it.points }
println("best: $bestPoints at level $bestLevel")

Sortie :

ada: 120
bo: 95
best: 120 at level 3

Seules les propriétés du constructeur primaire sont prises en compte : une propriété déclarée dans le corps de la classe est exclue de toString, equals, hashCode et copy. Une classe de données doit avoir au moins un paramètre de constructeur, et chaque paramètre doit être un val ou un var :

data class Reading(val sensor: String, val value: Int) {
    var note = ""
}

Dans main :

val r1 = Reading("t1", 20)
val r2 = Reading("t1", 20)
r1.note = "checked"
println(r1)
println(r1 == r2)

Sortie :

Reading(sensor=t1, value=20)
true
challenge icon

Défi

Facile

Faites de Book une classe de données afin qu’elle s’affiche et se compare par valeur. Complétez ensuite trois fonctions : parse(line) transforme Dune;Herbert;1965 en un Book, newEdition(book, year) renvoie une copie avec la nouvelle année et (new edition) ajouté au titre, et describe(book) renvoie Dune by Herbert, 1965 en utilisant une déclaration de déstructuration.

Le code fourni analyse chaque ligne d’entrée, affiche chaque livre, le nombre de doublons, la nouvelle édition du premier livre (année 2024) ainsi qu’une description de chaque livre distinct.

Votre code doit être placé dans Book.kt et BookTools.kt. Main.kt contient le code d’entrée/sortie fourni et ne peut pas être modifié.

REQUIRED OUTPUT FORMAT: [Your translated content here]

Essayez vous-même

fun main() {
    // Code d'entrée/sortie fourni : le garder tel quel
    val input = generateSequence(::readLine).toList()
    val books = input.map { parse(it) }
    for (b in books) println(b)
    println("duplicates: ${books.size - books.distinct().size}")
    println(newEdition(books[0], 2024))
    for (b in books.distinct()) println(describe(b))
}
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