Datenklassen in Kotlin

1. Übersicht

Die Kotlin-Sprache führt das Konzept der Datenklassen ein, die einfache Klassen darstellen, die als Datencontainer verwendet werden und keine zusätzliche Logik enthalten. Einfach ausgedrückt, die Lösung von Kotlin ermöglicht es uns, das Schreiben von viel Boilerplate-Code zu vermeiden.

In diesem kurzen Artikel werfen wir einen Blick auf Datenklassen in Kotlin und vergleichen sie mit ihren Java-Gegenstücken.

2. Kotlin-Setup

Informationen zum Einrichten des Kotlin-Projekts finden Sie in unserer Einführung in das Kotlin-Sprach- Tutorial.

3. Datenklassen in Java

Wenn wir einen Filmeintrag in Java erstellen wollten, müssten wir viel Boilerplate-Code schreiben:

public class Movie { private String name; private String studio; private float rating; public Movie(String name, String studio, float rating) { this.name = name; this.studio = studio; this.rating = rating; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getStudio() { return studio; } public void setStudio(String studio) { this.studio = studio; } public float getRating() { return rating; } public void setRating(float rating) { this.rating = rating; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + Float.floatToIntBits(rating); result = prime * result + ((studio == null) ? 0 : studio.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Movie other = (Movie) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (Float.floatToIntBits(rating) != Float.floatToIntBits(other.rating)) return false; if (studio == null) { if (other.studio != null) return false; } else if (!studio.equals(other.studio)) return false; return true; } @Override public String toString() { return "Movie [name=" + name + ", studio=" + studio + ", rating=" + rating + "]"; } }

86 Codezeilen. Das ist eine Menge, um nur drei Felder in einer einfachen Klasse zu speichern.

4. Kotlin-Datenklasse

Jetzt erstellen wir mit Kotlin dieselbe Movie- Klasse mit denselben Funktionen :

data class Movie(var name: String, var studio: String, var rating: Float)

Wie wir sehen können, ist das massiv einfacher und sauberer. Konstruktor-, toString () -, equals () -, hashCode () - und zusätzliche Funktionen copy () und componentN () werden automatisch generiert.

4.1. Verwendung

Eine Datenklasse wird auf die gleiche Weise wie andere Klassen instanziiert:

val movie = Movie("Whiplash", "Sony Pictures", 8.5F)

Jetzt sind die Eigenschaften und Funktionen von verfügbar:

println(movie.name) //Whiplash println(movie.studio) //Sony Pictures println(movie.rating) //8.5 movie.rating = 9F println(movie.toString()) //Movie(name=Whiplash, studio=Sony Pictures, rating=9.0)

4.2. Kopierfunktion

Die copy () - Funktion wird erstellt, falls ein Objekt kopiert werden muss, das einige seiner Eigenschaften ändert, den Rest jedoch unverändert lässt.

val betterRating = movie.copy(rating = 9.5F) println(betterRating.toString()) // Movie(name=Whiplash, studio=Sony Pictures, rating=9.5) 

Java bietet keine klare, native Möglichkeit zum Kopieren / Klonen von Objekten. Wir könnten die Verwendung clonable Schnittstelle, SerializationUtils.clone () oder einen Klonens Konstruktor .

4.3. Zerstörungserklärungen

Mit Destructuring Declarations können wir Objekteigenschaften als einzelne Werte behandeln. Für jede Eigenschaft in unserer Datenklasse wird eine Komponente N () generiert:

movie.component1() // name movie.component2() // studio movie.component3() // rating

Wir können auch mehrere Variablen aus dem Objekt oder direkt aus einer Funktion erstellen - es ist wichtig, sich an die Verwendung von Klammern zu erinnern:

val(name, studio, rating) = movie fun getMovieInfo() = movie val(namef, studiof, ratingf) = getMovieInfo()

4.4. Datenklassenanforderungen

Um eine Datenklasse zu erstellen, müssen wir folgende Anforderungen erfüllen:

  • Der primäre Konstruktor muss mindestens einen Parameter haben
  • Alle primären Konstruktorparameter müssen als val oder var markiert werden
  • Datenklassen können nicht abstrakt, offen, versiegelt oder innerlich sein
  • (vor 1.1.) Datenklassen dürfen nur Schnittstellen implementieren

Seit 1.1 können Datenklassen andere Klassen erweitern.

Wenn die generierte Klasse einen parameterlosen Konstruktor haben muss, müssen Standardwerte für alle Eigenschaften angegeben werden:

data class Movie(var name: String = "", var studio: String = "", var rating: Float = 0F)

5. Schlussfolgerung

Wir haben Datenklassen in Kotlin, ihre Verwendung und Anforderungen, die reduzierte Menge an geschriebenem Boilerplate-Code und Vergleiche mit demselben Code in Java gesehen.

Wenn Sie mehr über Kotlin erfahren möchten, lesen Sie Artikel wie Kotlin Java Interoperability und die bereits erwähnte Einführung in die Kotlin-Sprache .

Die vollständige Implementierung dieser Beispiele finden Sie in unserem GitHub-Projekt.