Sobes.tech
Junior

Erzählen Sie mir von Initialisierern in Klassen in Kotlin.

sobes.tech KI

Antwort von AI

In Kotlin können Klassen einen primären und einen oder mehrere sekundäre Konstruktoren haben. Initialisierer sind Codeblöcke init, die in der Reihenfolge ihrer Deklaration ausgeführt werden, nach dem primären Konstruktor (falls vorhanden) oder nach dem sekundären Konstruktor, wenn kein primärer vorhanden ist.

Primärer Konstruktor

Wird direkt in der Klassendeklaration deklariert. Er kann Parameter enthalten, die zur Initialisierung der Eigenschaften verwendet werden.

class User(name: String, age: Int) {
    init {
        // Dieser Block wird beim Erstellen einer Instanz der Klasse ausgeführt
        println("Benutzer erstellt: $name, $age")
    }
}

Sekundäre Konstruktoren

Werden mit dem Schlüsselwort constructor deklariert und müssen immer den Aufruf zu einem anderen Konstruktor der gleichen Klasse delegieren, entweder zum primären (über this) oder zu einem anderen sekundären.

class User {
    init {
        // Dieser Block wird zuerst ausgeführt, falls ein primärer Konstruktor vorhanden ist
    }

    constructor(name: String) : this() {
        // Sekundärer Konstruktor 1
        println("Benutzer erstellt mit Name: $name")
    }

    constructor(name: String, age: Int) : this(name) {
        // Sekundärer Konstruktor 2, ruft den ersten sekundären auf
        println("Benutzer erstellt mit Name und Alter: $name, $age")
    }
}

Ausführungsreihenfolge

  1. Der Code im primären Konstruktor (falls Parameter vorhanden sind, werden diese verwendet).
  2. Die init-Blöcke in Reihenfolge.
  3. Der Code im aufgerufenen sekundären Konstruktor (nach Delegierung).

Beispiel für die Ausführungsreihenfolge:

class Example {
    init {
        println("Init-Block 1")
    }

    constructor(i: Int) {
        println("Sekundärer Konstruktor $i")
    }

    init {
        println("Init-Block 2")
    }
}

fun main() {
    Example(10)
}

Ausgabe:

Init-Block 1
Init-Block 2
Sekundärer Konstruktor 10

Selbst wenn ein sekundärer Konstruktor aufgerufen wird, werden die init-Blöcke immer vor dessen Körper ausgeführt. Dies stellt sicher, dass die grundlegende Initialisierung des Objekts abgeschlossen ist, bevor spezifischer Code im sekundären Konstruktor ausgeführt wird.

Initialisierer sind unverzichtbar, um Logik auszuführen, die beim Erstellen einer beliebigen Instanz der Klasse ausgeführt werden muss, unabhängig davon, welcher Konstruktor verwendet wird. Zum Beispiel, um Eingabedaten zu überprüfen oder den Zustand des Objekts zu konfigurieren.