Kotlin Konstruktoren

Kotlin-Konstrukteure

1. Überblick

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.

Schauen Sie sich für die Einrichtung eines Kotlin-Projekts unsereintroductory tutorialan.

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

In den nächsten Abschnitten werden wir uns mit jedem Typ und den zugehörigen Konzepten befassen.

2. Primärer Konstruktor

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

This is a part of the class header. 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üsselwortval deklariert. Dies verhält sich genauso wie reguläre Variablen, mit der Erwähnung, dass die Eigenschaften vonvalchreibgeschützt sind (Javafinal keyword-Gegenstück).

Wenn wir die Referenz später ändern möchten, sollten wir stattdessen das Schlüsselwortvar verwenden. Der Feldtyp im Primärkonstruktor kann jedoch nicht weggelassen werden, da dies explizit sein muss.

In some cases, we can omit the constructor keyword. Dies ist nur in zwei Fällen obligatorisch: Wenn wir Anmerkungen wie@Autowired oder Zugriffsmodifikatoren wieprivate oderprotected verwenden.

Wir können auch 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, dassa class name is a constructor invocation. There’s no need to use the new keyword.

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, würde Java viel mehr Code benötigen, um das gleiche Ergebnis zu erzielen.

2.1. Primäre Konstruktoren in der JVM

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. Eigenschaften aus Konstruktorparametern initialisieren

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

Transformieren wirname in die EigenschaftupperCaseName:

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 zweiteninit-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 Initialisierungscode ausführen. Ein guter Ort dafür ist ein Initialisierungsblock, dem das Schlüsselwortinitvorangestellt ist.

The initializer block is called after the primary constructorWir können an dieser Stelle auch auf Klassenfelder zugreifen.

Eine Klasse kann einen oder mehrereinit Blöcke haben.

Hängen wir den Initialisierungsblock an die KlassePersonan:

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

Wenn wir als Nächstes ein Klassenobjekt vonPersonerstellen, sehen wir in der Konsole Folgendes:

Hello, I'm John

Wir würdenIllegalArgumentException für die leerensurname. werfen

Wenn wir vieleinit blocks haben, werden sie in derselben Reihenfolge ausgeführt, in der sie im Klassenkörper erscheinen.

5. Sekundärer Konstruktor

In einer Kotlin-Klasse können wir auch einen oder mehrere sekundäre Konstruktoren.Secondary constructors are prefixed with the constructor keyword deklarieren:

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")
}

Each secondary constructor has to delegate to the primary constructor. Wir tun dies mitthis keyword.

Verschieben wir unsere Eigenschaften inprimary constructor und ändern Siesecondary constructor:

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äßigfinal  sind. Dies bedeutet, dass wir das Schlüsselwortopen hinzufügen müssen, damit wir von unserer KlassePersonerben können.

Fügen wir eineEmployee-Klasse hinzu, die von derPerson -Klasse erbt. Sie verwenden beide primäre Konstruktoren:

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

Auf diese Weise übergeben wir einname an den primären Konstruktor derPerson -Skala. Zusätzlich fügen wir der KlasseEmployeeein neues Feld mit dem Namensalary 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 auf viele verschiedene Arten instanziieren, je nach unseren Wünschen.

Die Implementierung aller unserer Beispiele finden Sie inthe Github project.

Weitere Informationen zu den Kotlin-Funktionen selbst finden Sie in unserenintroduction to Kotlin.