Kotlin Konstruktoren

1. Übersicht

In diesem Tutorial werden wir uns die Konstruktoren in Kotlin genauer ansehen.

Beginnen wir mit einer kurzen Zusammenfassung des Konzepts: Wir verwenden Konstruktoren, um Objekte zu erstellen. Diese sehen aus wie Methodendeklarationen, haben jedoch immer den gleichen Namen wie die Klasse und geben nichts zurück.

Informationen zum Einrichten eines Kotlin-Projekts finden Sie in unserem Einführungs-Tutorial.

In Kotlin kann eine Klasse einen Primärkonstruktor und einen oder mehrere zusätzliche Sekundärkonstruktoren haben.

In den nächsten Abschnitten werden wir jeden Typ und die zugehörigen Konzepte behandeln.

2. Primärkonstruktor

Die erste Möglichkeit, ein Objekt in Kotlin zu erstellen, ist die Verwendung eines primären Konstruktors.

Dies ist ein Teil des Klassenkopfes. Parameter können auch Klassenfelder sein, die wir nach der Klassendeklaration einfügen.

Schauen wir uns eine grundlegende Klassendeklaration mit zwei Eigenschaften und einem primären Konstruktor an:

class Person constructor(val name: String, val age: Int? = null)

In diesem Beispiel haben wir Eigenschaften über das Schlüsselwort val deklariert. Dies verhält sich genauso wie reguläre Variablen, mit der Erwähnung, dass die Val- Eigenschaften schreibgeschützt sind (Java Final Keyword-Gegenstück).

Wenn wir die Referenz später ändern möchten, sollten wir stattdessen das Schlüsselwort var verwenden. Wir können jedoch den Feldtyp im primären Konstruktor nicht weglassen, da dies explizit sein muss.

In einigen Fällen können wir das Konstruktor- Schlüsselwort weglassen . Dies ist nur in zwei Fällen obligatorisch: Wenn wir Anmerkungen wie @Autowired oder Zugriffsmodifikatoren wie privat oder geschützt verwenden .

Außerdem können wir Kotlin-Standardparameter in den Konstruktoren verwenden.

Als nächstes wollen wir sehen, wie wir unseren primären Konstruktor verwenden können:

val person = Person("John") val personWithAge = Person("Mark", 22)

Wir können sehen, dass ein Klassenname ein Konstruktoraufruf ist. Das neue Schlüsselwort muss nicht verwendet werden.

Schauen wir uns als Referenz auch das Java-Äquivalent einer Konstruktordeklaration an:

class PersonJava { final String name; final Integer age; public PersonJava(String name) { this.name = name; this.age = null; } public PersonJava(String name, Integer age) { this.name = name; this.age = age; } }

Wie Sie sehen können, würde Java viel mehr Code benötigen, um das gleiche Ergebnis zu erzielen.

2.1. Primärkonstruktoren auf der JVM

Bitte beachten Sie, dass der Compiler einen zusätzlichen Konstruktor ohne Parameter in der JVM generiert. Zu diesem Zweck wird ein Objekt mit Standardwerten instanziiert.

Auf diese Weise kann Kotlin gut mit Bibliotheken wie Jackson oder JPA zusammenarbeiten, die den Konstruktor no-args verwenden, um Klasseninstanzen zu erstellen:

class Person(val name: String = "")

3. Initialisieren von Eigenschaften aus Konstruktorparametern

Eigenschaftsinitialisierer aus dem Klassenkörper können die primären Konstruktorparameter verwenden.

Lassen Sie uns den Namen in die Eigenschaft UpperCaseName umwandeln :

class Person(val name: String, val age: Int? = null) { val upperCaseName: String = name.toUpperCase() }

Wir können die Ausgabe in der Konsole sehen, indem wir den zweiten Init- Block hinzufügen :

init { println("Upper case name is $upperCaseName") }

4. Initialisierungsblöcke

Wir können keinen Code in den primären Konstruktor einfügen.

Manchmal müssen wir jedoch einen Initialisierungscode ausführen. Ein guter Ort dafür ist ein Initialisierungsblock, dem das Schlüsselwort init vorangestellt ist .

Der Initialisierungsblock wird nach dem primären Konstruktor aufgerufen . Wir können an dieser Stelle auch auf Klassenfelder zugreifen.

Eine Klasse kann einen oder mehrere Init- Blöcke haben.

Hängen wir den Initialisierungsblock an unsere Person- Klasse an:

init { println("Hello, I'm $name") if (surname.isEmpty()) { throw IllegalArgumentException("Surname cannot be empty!") } }

Wenn wir als Nächstes ein Personenklassenobjekt erstellen , sehen wir in der Konsole Folgendes:

Hello, I'm John

Wir würden IllegalArgumentException für den leeren Nachnamen auslösen .

Wenn wir viele Init- Blöcke haben, werden sie in derselben Reihenfolge ausgeführt, in der sie im Klassenkörper erscheinen.

5. Sekundärkonstruktor

In einer Kotlin-Klasse können wir auch einen oder mehrere sekundäre Konstruktoren deklarieren . Sekundären Konstruktoren wird das Konstruktor- Schlüsselwort vorangestellt :

class Car { val id: String val type: String constructor(id: String, type: String) { this.id = id this.type = type } }

Und die grundlegende Verwendung:

fun main(args: Array) { val car = Car("1", "sport") val suvCar = Car("2", "suvCar") } 

Jeder sekundäre Konstruktor muss an den primären Konstruktor delegieren . Wir machen das mit diesem Schlüsselwort.

Verschieben wir unsere Eigenschaften in den Primärkonstruktor und ändern den Sekundärkonstruktor:

class Car(val id: String, val type: String) { constructor(id: String): this(id, "unknown") }

6. Konstruktoren und Vererbung

Wir können einen primären Konstruktor der Oberklasse verwenden.

Beachten Sie, dass alle Klassen in Kotlin standardmäßig endgültig sind . Dies bedeutet , dass wir das Schlüsselwort open hinzufügen müssen, damit wir von unserer Person- Klasse erben können .

Fügen wir eine Employee- Klasse hinzu, die von der Person- Klasse erbt . Sie verwenden beide Primärkonstruktoren:

class Employee(name: String, val salary: Int): Person(name) 

Auf diese Weise übergeben wir dem primären Konstruktor der Person- Klasse einen Namen . Zusätzlich fügen wir der Employee- Klasse ein neues Feld mit dem Namen Gehalt hinzu .

7. Fazit

In diesem kurzen Artikel haben wir verschiedene Möglichkeiten zum Erstellen von Konstruktoren in der Kotlin-Sprache erörtert. Wir können unsere Felder nach unseren Wünschen auf viele verschiedene Arten instanziieren.

Die Implementierung all unserer Beispiele finden Sie im Github-Projekt.

Weitere Informationen zu den Kotlin-Funktionen selbst finden Sie in unserer Einführung zu Kotlin.