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
1Sans 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)
falseLes 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 3Seules 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)
trueDéfi
FacileFaites 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é.
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))
}
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 personnel7Classes spéciales
Classes de donnéesClasses EnumHiérarchies scelléesequals, hashCode, toStringRécapitulatif - Suivi des commandes2Proprié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