data class en Kotlin — qu'est-ce que c'est, syntaxe et caractéristiques des classes de données

Auteur : IT Sectr Publié le : 2026-06-20 Temps de lecture : 10 min

data class en Kotlin est un type spécial de classe conçue exclusivement pour stocker des données. Le compilateur génère automatiquement les méthodes equals, hashCode, toString, copy et componentN en fonction des propriétés spécifiées dans le constructeur principal. Selon la documentation JetBrains (2026), data class permet de réduire le code standard de 50 à 70% par rapport aux équivalents Java et constitue la base des objets value dans les projets Kotlin.

Points clés

  • data — mot-clé pour déclarer une classe de données en Kotlin
  • equals et hashCode — générés automatiquement sur la base de toutes les propriétés du constructeur principal
  • copy — fonction de copie superficielle avec possibilité de remplacer des champs individuels
  • componentN — déstructuration de data class en variables séparées
  • Le constructeur principal doit contenir au moins un paramètre val ou var

Qu'est-ce qu'un data class en Kotlin ?

data class est une construction syntaxique de Kotlin qui génère automatiquement des méthodes standard pour les classes dont l'objectif principal est le stockage de données. Lors de la déclaration d'un data class, le compilateur crée des implémentations de equals, hashCode, toString, copy et componentN basées sur toutes les propriétés du constructeur principal.

Contrairement aux classes classiques en Java, où le développeur doit écrire manuellement les getters, setters, equals, hashCode et toString à l'aide d'un IDE ou de bibliothèques comme Lombok, Kotlin fournit un mécanisme intégré. Cela réduit non seulement le code, mais garantit également la cohérence — les méthodes automatiques correspondent toujours à la structure actuelle des propriétés.

Selon l'enquête JetBrains Kotlin (2025), data class est utilisé dans 78% des projets Kotlin, ce qui en fait l'une des fonctionnalités les plus demandées du langage. Il est particulièrement populaire dans les architectures avec DTO, modèles de réponse API et objets d'état en MVVM.

Syntaxe et fonctionnalités de base

data class se déclare avec le mot-clé data avant class. Toutes les propriétés participant aux méthodes automatiques sont spécifiées dans le constructeur principal.

kotlin
data class User(
    val id: Int,
    val name: String,
    val email: String
)

Une ligne de code remplace des dizaines de lignes de code standard en Java. Le compilateur génère equals, hashCode, toString, copy et component1–component3 pour les trois propriétés.

Propriétés en dehors du constructeur principal

Les méthodes automatiques incluent uniquement les propriétés du constructeur principal. Si une propriété est déclarée dans le corps de la classe, elle ne participe pas à equals, hashCode, toString et copy.

kotlin
data class Product(
    val id: Int,
    val title: String
) {
    var cachedPrice: Double = 0.0
    // cachedPrice is NOT included in equals/hashCode/copy
}

Limitations du constructeur principal

Le constructeur principal d'un data class doit contenir au moins un paramètre. Tous les paramètres doivent être marqués val ou var. Les modificateurs open, abstract, sealed ou inner ne peuvent pas être utilisés pour un data class.

Méthodes automatiques equals, hashCode et toString

equals et hashCode sont générés en fonction des valeurs de toutes les propriétés du constructeur principal. Deux instances d'un data class sont considérées comme égales si toutes leurs propriétés correspondantes sont égales.

equals pour la comparaison de valeur

En Java, la comparaison d'objets par défaut est la comparaison de références (==). La comparaison par valeur nécessite la redéfinition de equals. Kotlin data class le fait automatiquement, permettant d'utiliser == pour la comparaison structurelle.

kotlin
data class Address(
    val city: String,
    val street: String
)

val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2)  // true

toString pour le débogage

La méthode toString renvoie une représentation lisible de l'objet avec les noms et valeurs de toutes les propriétés. Cela simplifie considérablement la journalisation et le débogage par rapport à Java, où la sortie par défaut affiche le code de hachage au format hexadécimal.

Selon la Documentation Kotlin (2026), le toString d'un data class a le format : « User(id=1, name=John, email=john@example.com) ». Lors de la suppression de propriétés du constructeur principal, toString est automatiquement mis à jour — le risque de désynchronisation est éliminé.

Fonction copy et déstructuration

copy est l'une des fonctionnalités clés de data class. Elle crée une copie superficielle de l'objet avec la possibilité de modifier les valeurs des propriétés spécifiées.

kotlin
data class Order(
    val id: Long,
    val status: String,
    val amount: Double
)

val order = Order(1L, "Pending", 299.99)
val updatedOrder = order.copy(status = "Confirmed")
// updatedOrder.id = 1L, amount = 299.99, status = "Confirmed"

copy est indispensable dans le style fonctionnel et les architectures avec immuabilité. Au lieu de muter un objet existant, une nouvelle copie est créée avec des champs modifiés, rendant le code plus prévisible et sûr dans les scénarios multithread.

Déstructuration via componentN

data class génère automatiquement les fonctions component1, component2 et ainsi de suite pour chaque propriété dans l'ordre de déclaration. Cela permet de déstructurer l'objet en variables.

kotlin
val user = User(1, "Alice", "alice@example.com")
val (id, name, email) = user
println("$id: $name ($email)")  // "1: Alice (alice@example.com)"

La déstructuration fonctionne également dans les lambdas et les boucles for-each, rendant data class pratique pour travailler avec les collections.

Limitations et recommandations

Première limitation — data class ne prend pas en charge l'héritage d'un autre data class. On ne peut hériter que de classes régulières ou d'interfaces.

Deuxième — les méthodes automatiques n'incluent que les propriétés du constructeur principal. Les propriétés dans le corps de la classe sont ignorées, ce qui peut conduire à un equals incorrect si vous l'oubliez.

Troisième — data class ne peut pas être open, abstract, sealed ou inner. Il est toujours final.

Quatrième — pour les collections à l'intérieur d'un data class, copy effectue une copie superficielle. La modification des éléments à l'intérieur de la collection copiée affectera l'original.

Selon les Bonnes Pratiques Kotlin (2026), data class est optimal pour les DTO, modèles API, objets de valeur et objets d'état. Pour les composants avec logique métier, il est recommandé d'utiliser des classes régulières.

Foire Aux Questions

Un data class peut-il hériter d'un autre data class ?

Non, un data class ne peut pas hériter d'un autre data class. Cependant, il peut hériter d'une classe régulière ou implémenter des interfaces.

Combien de propriétés doivent être dans le constructeur principal ?

Au moins une propriété. Le nombre maximum n'est pas limité, mais componentN est généré pour la déstructuration.

Les propriétés du corps de la classe affectent-elles equals ?

Non, les méthodes automatiques ne prennent en compte que les propriétés du constructeur principal. Les propriétés du corps de la classe ne participent pas à equals, hashCode, toString et copy.

Puis-je redéfinir les méthodes automatiques manuellement ?

Oui, vous pouvez redéfinir equals, hashCode ou toString dans le corps du data class. Dans ce cas, le compilateur ne génère pas sa propre implémentation.

En quoi data class diffère-t-il d'une classe régulière ?

Un data class génère automatiquement equals, hashCode, toString, copy et componentN. Une classe régulière ne fournit pas ces méthodes sans implémentation manuelle.

Résumé

  • data class — construction syntaxique Kotlin pour stocker des données avec des méthodes auto-générées
  • equals et hashCode — comparaison structurelle basée sur les propriétés du constructeur principal
  • toString — représentation lisible de l'objet pour le débogage et la journalisation
  • copy — copie superficielle avec remplacement de champs individuels par arguments nommés
  • componentN — déstructuration d'objets en variables pour un travail pratique avec les collections
  • Limitations — final par défaut, au moins une propriété, pas d'héritage data->data
  • Utilisation — DTO, modèles API, objets de valeur, état en MVVM

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi