English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In this article, you will learn how to create data classes in Kotlin. You will also learn about the requirements that data classes must meet and their standard features.
You may encounter a situation where you need to create a class that is only used to store data. In this case, you can mark the class as data to create a data class. For example:
data class Person(val name: String, var age: Int)
For this type, the compiler will automatically generate:
copy() function, equals() and hashCode() pairs, and the toString() form of the primary constructor
componentN() functions
Before discussing these functions in detail, let's discuss the requirements that data classes must meet.
The requirements are as follows:
The primary constructor must have at least one parameter.
The parameters of the primary constructor must be marked as val (read-only) or var (read-write).
The class cannot be open, abstract, inner, or sealed.
The class can extend other classes or implement interfaces. If you are using1.1Previous versions of Kotlin required the class to implement an 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}") }
Wenn dieses Programm ausgeführt wird, lautet die Ausgabe:
name = jack age = 29
Wenn Sie eine Datenklasse deklarieren, generiert der Compiler im Hintergrund automatisch mehrere Funktionen wie toString(), equals(), hashCode() usw. Dies hilft dabei, den Code kompakt zu halten. Wenn Sie Java verwenden, müssen Sie viel Stubcode schreiben.
Lassen Sie uns die folgenden Funktionen verwenden:
Für Datenklassen kann die copy()-Funktion verwendet werden, um eine Kopie des Objekts mit verschiedenen Eigenschaften zu erstellen. Der Mechanismus funktioniert wie folgt:
data class User(val name: String, val age: Int) fun main(args: Array<String>) { val u1 = User("John", 29) //Verwenden Sie die Kopiefunktion, um ein Objekt zu erstellen val u2 = u1.copy(name = "Randy") println("u1: name = ${u1.name}, name = ${u1.age") println("u2: name = ${u2.name}, name = ${u2.age") }
Wenn dieses Programm ausgeführt wird, lautet die Ausgabe:
u1: name = John, name = 29 u2: name = Randy, name = 29
Die toString()-Funktion gibt die Zeichenkettenrepräsentation des Objekts zurück.
data class User(val name: String, val age: Int) fun main(args: Array<String>) { val u1 = User("John", 29) println(u1.toString()) }
Wenn dieses Programm ausgeführt wird, lautet die Ausgabe:
User(name = John, age =29)
Die Methode hasCode() gibt den Hash-Wert des Objekts zurück. Wenn zwei Objekte gleich sind, erzeugt hashCode() denselben Integer-Wert.
Wenn zwei Objekte gleich sind (hashCode() ist gleich), gibt equals() true zurück. Wenn die Objekte ungleich sind, gibt equals() false zurück.
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 gleich u2.)" else println("u1 ungleich u2.)" if (u1.equals(u3) == true) println("u1 gleich u3.)" else println("u1 ungleich u3.)" }
Wenn dieses Programm ausgeführt wird, lautet die Ausgabe:
u1 hashcode = 71750738 u2 hashcode = 71750738 u3 hashcode = 771732263 u1 gleich u2. u1 ungleich u3.
Sie können eine Dekonstruktionserklärung verwenden, um ein Objekt in mehrere Variablen zu zerlegen. Zum Beispiel:
data class User(val name: String, val age: Int, val gender: String) fun main(args: Array<String>) { val u1 = User("John", 29, "Männlich") val (name, age, gender) = u1 println("name = $name") println("age = $age") println("gender = $gender") }
Wenn dieses Programm ausgeführt wird, lautet die Ausgabe:
name = John age = 29 gender = Männlich
Dies ist möglich, weil der Compiler für die Datenklasse die component()-Funktion für alle Attribute generiert. Zum Beispiel:
data class User(val name: String, val age: Int, val gender: String) fun main(args: Array<String>) { val u1 = User("John", 29, "Männlich") println(u1.component1()) // John println(u1.component2()) // 29 println(u1.component3()) // "Männlich" }
Wenn dieses Programm ausgeführt wird, lautet die Ausgabe:
John 29 Männlich