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 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.
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.
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.
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.
data class Product(
val id: Int,
val title: String
) {
var cachedPrice: Double = 0.0
// cachedPrice is NOT included in equals/hashCode/copy
}
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.
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.
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.
data class Address(
val city: String,
val street: String
)
val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2) // true
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é.
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.
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.
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.
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.
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
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.
Au moins une propriété. Le nombre maximum n'est pas limité, mais componentN est généré pour la déstructuration.
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.
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.
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é
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.
Lisez aussi