Kotlin-Konstruktoren und -Initialisierer (mit Beispielen)

In diesem Artikel lernen Sie anhand von Beispielen Konstruktoren in Kotlin (sowohl primäre als auch sekundäre Konstruktoren) sowie Initialisierungsblöcke kennen.

Ein Konstruktor ist eine übersichtliche Methode zum Initialisieren von Klasseneigenschaften.

Es ist eine spezielle Elementfunktion, die aufgerufen wird, wenn ein Objekt instanziiert (erstellt) wird. Wie sie in Kotlin funktionieren, ist jedoch etwas anders.

In Kotlin gibt es zwei Konstruktoren:

  • Primärkonstruktor - prägnante Methode zum Initialisieren einer Klasse
  • Sekundärer Konstruktor - Ermöglicht das Einfügen zusätzlicher Initialisierungslogik

Primärkonstruktor

Der primäre Konstruktor ist Teil des Klassenkopfs. Hier ist ein Beispiel:

 Klasse Person (val Vorname: String, var Alter: Int) (// Klassenkörper)

Der von Klammern umgebene Codeblock ist der primäre Konstruktor : (val firstName: String, var age: Int).

Der Konstruktor hat zwei Eigenschaften deklariert: firstName(schreibgeschützte Eigenschaft, wie sie mit dem Schlüsselwort deklariert wurde val) und age(schreibgeschützte Eigenschaft, wie sie mit dem Schlüsselwort deklariert wurde var).

Beispiel: Primärkonstruktor

 fun main(args: Array) ( val person1 = Person("Joe", 25) println("First Name = $(person1.firstName)") println("Age = $(person1.age)") ) class Person(val firstName: String, var age: Int) ( )

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

 Vorname = Joe Alter = 25

Wenn das Objekt der PersonKlasse erstellt wird "Joe"und 25Werte wie Personeine Funktion übergeben werden.

Diese initialisiert firstNameund ageEigenschaften von person1 Objekt auf "Joe"und 25ist.

Es gibt andere Möglichkeiten, Primärkonstruktoren zu verwenden.

Primärkonstruktor- und Initialisierungsblöcke

Der primäre Konstruktor hat eine eingeschränkte Syntax und kann keinen Code enthalten.

Um den Initilisierungscode (nicht nur den Code zum Initialisieren von Eigenschaften) einzufügen, wird der Initialisierungsblock verwendet. Dem initSchlüsselwort wird ein Präfix vorangestellt . Lassen Sie uns das obige Beispiel mit dem Initialisierungsblock ändern:

 fun main(args: Array) ( val person1 = Person("joe", 25) ) class Person(fName: String, personAge: Int) ( val firstName: String var age: Int // initializer block init ( firstName = fName.capitalize() age = personAge println("First Name = $firstName") println("Age = $age") ) )

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

 First Name = Joe Age = 25

Hier Parameter fName und Persönlichkeit in der Klammer nimmt Werte "Joe"und 25jeweils , wenn person1 Objekt erstellt wird. FName und personAge werden jedoch ohne Verwendung von varoder verwendet valund sind keine Eigenschaften der PersonKlasse.

Die PersonKlasse hat zwei Eigenschaften: Vorname und Alter werden deklariert.

Wenn ein person1Objekt erstellt wird, wird der Code im Initialisierungsblock ausgeführt. Der Initialisierungsblock initialisiert seine Eigenschaften nicht nur, sondern druckt sie auch aus.

Hier ist eine andere Möglichkeit, dieselbe Aufgabe auszuführen:

 fun main(args: Array) ( val person1 = Person("joe", 25) ) class Person(fName: String, personAge: Int) ( val firstName = fName.capitalize() var age = personAge // initializer block init ( println("First Name = $firstName") println("Age = $age") ) )

Zur Unterscheidung des Konstruktorparameters und der Eigenschaft werden verschiedene Namen verwendet (fName und firstName sowie personAge und age). Es ist üblicher, _firstName und _age anstelle eines völlig anderen Namens für Konstruktorparameter zu verwenden. Beispielsweise:

 Klasse Person (_firstName: String, _age: Int) (val firstName = _firstName.capitalize () var age = _age // Initialisiererblock init (…)) 

Standardwert im Primärkonstruktor

Sie können Konstruktorparametern einen Standardwert bereitstellen (ähnlich wie Standardargumente für Funktionen). Beispielsweise:

 fun main(args: Array) ( println("person1 is instantiated") val person1 = Person("joe", 25) println("person2 is instantiated") val person2 = Person("Jack") println("person3 is instantiated") val person3 = Person() ) class Person(_firstName: String = "UNKNOWN", _age: Int = 0) ( val firstName = _firstName.capitalize() var age = _age // initializer block init ( println("First Name = $firstName") println("Age = $age") ) )

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

 Vorname = Joe Alter = 25 Person2 wird instanziiert Vorname = Jack Alter = 0 Person3 wird instanziiert Vorname = UNBEKANNT Alter = 0

Kotlin Sekundärkonstruktor

In Kotlin kann eine Klasse auch einen oder mehrere sekundäre Konstruktoren enthalten. Sie werden mit constructorSchlüsselwörtern erstellt.

Sekundärkonstruktoren sind in Kotlin nicht so häufig. Die häufigste Verwendung des sekundären Konstruktors tritt auf, wenn Sie eine Klasse erweitern müssen, die mehrere Konstruktoren bereitstellt, die die Klasse auf unterschiedliche Weise initialisieren. Überprüfen Sie unbedingt die Kotlin-Vererbung, bevor Sie sie lernen.

So können Sie in Kotlin einen sekundären Konstruktor erstellen:

 Klasse Log (Konstruktor (Daten: String) (// etwas Code) Konstruktor (Daten: String, numberOfData: Int) (// etwas Code))

Hier hat die LogKlasse zwei sekundäre Konstruktoren, aber keinen primären Konstruktor.

Sie können die Klasse erweitern als:

 Klasse Log (Konstruktor (Daten: String) (// Code) Konstruktor (Daten: String, numberOfData: Int) (// Code)) Klasse AuthLog: Log (Konstruktor (Daten: String): super (Daten) (// Code ) Konstruktor (Daten: String, numberOfData: Int): super (Daten, numberOfData) (// Code))

Hier rufen Konstruktoren der abgeleiteten Klasse AuthLogden entsprechenden Konstruktor der Basisklasse auf Log. Dafür super()wird verwendet.

In Kotlin können Sie auch einen Konstruktor von einem anderen Konstruktor derselben Klasse (wie in Java) mit aufrufen this().

 Klasse AuthLog: Log (Konstruktor (Daten: String): dieser (Daten, 10) (// Code) Konstruktor (Daten: String, numberOfData: Int): super (Daten, numberOfData) (// Code)) 

Beispiel: Kotlin-Sekundärkonstruktor

 fun main(args: Array) ( val p1 = AuthLog("Bad Password") ) open class Log ( var data: String = "" var numberOfData = 0 constructor(_data: String) ( ) constructor(_data: String, _numberOfData: Int) ( data = _data numberOfData = _numberOfData println("$data: $numberOfData times") ) ) class AuthLog: Log ( constructor(_data: String): this("From AuthLog -> " + _data, 10) ( ) constructor(_data: String, _numberOfData: Int): super(_data, _numberOfData) ( ) )

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

 Von AuthLog -> Falsches Passwort: 10 mal

Hinweis: Der sekundäre Konstruktor muss die Basisklasse initialisieren oder an einen anderen Konstruktor delegieren (wie im obigen Beispiel), wenn die Klasse keinen primären Konstruktor hat.

Interessante Beiträge...