Kotlin-Datenklasse

In diesem Artikel lernen Sie, Datenklassen in Kotlin zu erstellen. Sie erfahren auch, welche Anforderungen die Datenklasse erfüllen muss und welche Standardfunktionen sie bietet.

Es kann vorkommen, dass Sie eine Klasse nur zum Speichern von Daten erstellen müssen. In solchen Fällen können Sie die Klasse als markieren data, um eine Datenklasse zu erstellen. Beispielsweise,

 Datenklasse Person (Wertname: String, var age: Int)

Für diese Klasse generiert der Compiler automatisch:

  • copy()Funktion equals()und hashCode()Paar und toString()Form des primären Konstruktors
  • componentN() Funktionen

Bevor wir uns ausführlich mit diesen Funktionen befassen, wollen wir uns mit den Anforderungen befassen, die eine Datenklasse erfüllen muss.

Anforderungen an Kotlin-Datenklassen

Hier sind die Anforderungen:

  • Der primäre Konstruktor muss mindestens einen Parameter haben.
  • Die Parameter des primären Konstruktors müssen entweder als val(schreibgeschützt) oder var(schreibgeschützt) gekennzeichnet sein.
  • Die Klasse kann nicht offen, abstrakt, innerlich oder versiegelt sein.
  • Die Klasse kann andere Klassen erweitern oder Schnittstellen implementieren. Wenn Sie die Kotlin-Version vor 1.1 verwenden, kann die Klasse nur Schnittstellen implementieren.

Beispiel: Kotlin-Datenklasse

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

Wenn Sie das Programm ausführen, lautet die Ausgabe wie folgt:

 Name = Jack Alter = 29

Wenn Sie eine Datenklasse deklarieren, erzeugt der Compiler automatisch mehrere Funktionen wie toString(), equals(), hashcode()usw. hinter den Kulissen. Dies hilft Ihnen, den Code präzise zu halten. Wenn Sie Java verwendet hätten, müssten Sie viel Boilerplate-Code schreiben.

Verwenden wir diese Funktionen:

Kopieren

Für eine Datenklasse können Sie mithilfe der copy()Funktion eine Kopie eines Objekts erstellen, dessen Eigenschaften sich von denen der Funktion unterscheiden. So funktioniert das:

 data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) // using copy function to create an object val u2 = u1.copy(name = "Randy") println("u1: name = $(u1.name), name = $(u1.age)") println("u2: name = $(u2.name), name = $(u2.age)") )

Wenn Sie das Programm ausführen, lautet die Ausgabe wie folgt:

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

toString () -Methode

Die Funktion toString () gibt eine Zeichenfolgendarstellung des Objekts zurück.

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

Wenn Sie das Programm ausführen, lautet die Ausgabe wie folgt:

 Benutzer (Name = John, Alter = 29)

hashCode () und equals ()

Die hasCode()Methode gibt Hash-Code für das Objekt zurück. Wenn zwei Objekte gleich sind, hashCode()wird das gleiche ganzzahlige Ergebnis erzeugt. Empfohlene Lektüre: hashCode ()

Die equals()Renditen , truewenn zwei Objekte gleich sind (hat gleiche hashCode()). Wenn Objekte nicht gleich sind, wird equals()zurückgegeben false. Empfohlene Lektüre: equals ()

 data class User(val name: String, val age: Int) fun main(args: Array) ( 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 is equal to u2.") else println("u1 is not equal to u2.") if (u1.equals(u3) == true) println("u1 is equal to u3.") else println("u1 is not equal to u3.") )

Wenn Sie das Programm ausführen, lautet die Ausgabe wie folgt:

u1 Hashcode = 71750738 u2 Hashcode = 71750738 u3 Hashcode = 771732263 u1 ist gleich u2. u1 ist nicht gleich u3.

Zerstörungserklärungen

Sie können ein Objekt mithilfe der Destructing-Deklaration in eine Reihe von Variablen destrukturieren. Beispielsweise:

 Datenklasse Benutzer (Wertname: String, Wertalter: Int, Wert Geschlecht: String) fun main(args: Array) ( val u1 = User("John", 29, "Male") val (name, age, gender) = u1 println("name = $name") println("age = $age") println("gender = $gender") )

Wenn Sie das Programm ausführen, lautet die Ausgabe wie folgt:

 Name = John Alter = 29 Geschlecht = Männlich

Dies war möglich, weil der Compiler componentN()Funktionen aller Eigenschaften für eine Datenklasse generiert . Beispielsweise:

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

Wenn Sie das Programm ausführen, lautet die Ausgabe wie folgt:

 John 29 Männlich

Interessante Beiträge...