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