English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Classes de données (Data) en Kotlin

Dans cet article, vous apprendrez à créer des classes de données en Kotlin. Vous découvrirez également les exigences auxquelles les classes de données doivent répondre ainsi que leurs fonctionnalités standard.

Il peut y avoir une telle situation : vous devez créer une classe dédiée au stockage des données. Dans ce cas, vous pouvez marquer la classe comme data pour créer une classe de données. Par exemple,

data class Person(val name: String, var age: Int)

Pour ce type, le compilateur génère automatiquement :

  • Fonction copy(), equals() et hashCode() ainsi que la forme toString() du constructeur principal

  • Fonctions componentN()

Avant de discuter de ces fonctions en détail, parlons des exigences auxquelles le type de données doit répondre.

Exigences du type de données Kotlin

Les exigences sont les suivantes :

  • Le constructeur principal doit avoir au moins un paramètre.

  • Les paramètres du constructeur principal doivent être marqués comme val (lecture seule) ou var (lecture/écriture).

  • La classe ne peut pas être ouverte, abstraite, interne ou fermée.

  • Cette classe peut étendre d'autres classes ou implémenter des interfaces. Si vous utilisez1.1Dans les versions précédentes de Kotlin, cette classe ne peut qu'implémenter l'interface.

Exemple : Classes de données Kotlin utilisées

data class User(val name: String, val age: Int)
fun main(args: Array<String>) {
    val jack = User("jack", 29)
    println("name = ${jack.name}")
    println("age = ${jack.age}")
}

Lors de l'exécution de ce programme, la sortie est :

name = jack
age = 29

Lorsque vous déclarez une classe de données, le compilateur génère automatiquement plusieurs fonctions en arrière-plan, telles que toString(), equals(), hashCode(), etc. Cela aide à maintenir la concision du code. Si vous utilisez Java, vous devez écrire beaucoup de code de modèle.
Utilisons les fonctions suivantes :

Fonction copy() - Copie

Pour les classes de données, vous pouvez utiliser la fonction copy() pour créer des copies d'objets avec des attributs différents. Voici comment cela fonctionne :

data class User(val name: String, val age: Int)
fun main(args: Array<String>) {
    val u1 = User("John", 29)
   
    //Créer des objets en utilisant la fonction de copie
    val u2 = u1.copy(name = "Randy")
    println("u1: name = ${u1.name}, name = ${u1.age")
    println("u2: name = ${u2.name}, name = ${u2.age")
}

Lors de l'exécution de ce programme, la sortie est :

u1: name = John, name = 29
u2: name = Randy, name = 29

La méthode toString() - Renvoie une chaîne de caractères

La fonction toString() renvoie la représentation en chaîne de caractères de l'objet.

data class User(val name: String, val age: Int)
fun main(args: Array<String>) {
    val u1 = User("John", 29)
    println(u1.toString())
}

Lors de l'exécution de ce programme, la sortie est :

User(name = John, age =29)

hashCode() et equals()

La méthode hasCode() renvoie le code de hachage de l'objet. Si deux objets sont égaux, hashCode() génère le même résultat de nombre entier.

Si deux objets sont égaux (hashCode() est le même), alors equals() renvoie true. Si les objets ne sont pas égaux, equals() renvoie false.

data class User(val name: String, val age: Int)
fun main(args: Array<String>) {
    val u1 = User("John", 29)
    val u2 = u1.copy()
    val u3 = u1.copy(name = "Amanda")
    println("u1 hashCode = ${u1.hashCode()")
    println("u2 hashCode = ${u2.hashCode()")
    println("u3 hashCode = ${u3.hashCode()")
    if (u1.equals(u2) == true)
        println("u1 égal à u2.
    else
        println("u1 ne pas être égal à u2.
    if (u1.equals(u3) == true)
        println("u1 égal à u3.
    else
        println("u1 ne pas être égal à u3.
}

Lors de l'exécution de ce programme, la sortie est :

u1 hashCode = 71750738
u2 hashCode = 71750738
u3 hashCode = 771732263
u1 égal à u2.
u1 ne pas être égal à u3.

Déclaration de déstructuration

Vous pouvez utiliser une déclaration de déstructuration pour décomposer un objet en plusieurs variables. Par exemple :

data class User(val name: String, val age: Int, val gender: String)
fun main(args: Array<String>) {
    val u1 = User("John", 29, "Male")
    val (name, age, gender) = u1
    println("name = $name")
    println("age = $age")
    println("genre = $genre")
}

Lors de l'exécution de ce programme, la sortie est :

name = John
age = 29
gender = Male

C'est possible car le compilateur génère automatiquement la fonction component() pour toutes les propriétés de la classe de données. Par exemple :

data class User(val name: String, val age: Int, val gender: String)
fun main(args: Array<String>) {
    val u1 = User("John", 29, "Male")
    println(u1.component1())     // John
    println(u1.component2())     // 29  
    println(u1.component3())     // "Male"
}

Lors de l'exécution de ce programme, la sortie est :

John
29
Male