Kotlin-konstruktører og initialiseringer (med eksempler)

I denne artikel lærer du om konstruktører i Kotlin (både primære og sekundære konstruktører) samt initialiseringsblokke ved hjælp af eksempler.

En konstruktør er en kortfattet måde at initialisere klasseegenskaber på.

Det er en speciel medlemsfunktion, der kaldes, når et objekt instantieres (oprettes). Men hvordan de arbejder i Kotlin er lidt anderledes.

I Kotlin er der to konstruktører:

  • Primær konstruktør - kortfattet måde at initialisere en klasse på
  • Sekundær konstruktør - giver dig mulighed for at sætte yderligere initialiseringslogik

Primær konstruktør

Den primære konstruktør er en del af klasseoverskriften. Her er et eksempel:

 klasse Person (val firstName: String, var age: Int) (// class body)

Blokken af koden omgivet af parenteser er den primære konstruktør: (val firstName: String, var age: Int).

Konstruktøren erklærede to egenskaber: firstName(skrivebeskyttet egenskab, da den erklæres ved hjælp af nøgleord val) og age(læs-skriv egenskab, som den erklæres med nøgleord var).

Eksempel: Primær konstruktør

 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) ( )

Når du kører programmet, vil output være:

 Fornavn = Joe Alder = 25

Når objektet til Personklasse oprettes, "Joe"og 25værdier overføres som om det Personer en funktion.

This initialisere firstNameog ageegenskaber person1 indsigelse mod "Joe"og 25henholdsvis.

Der er andre måder at bruge primære konstruktører på.

Primære konstruktør- og initialiseringsblokke

Den primære konstruktør har en begrænset syntaks og kan ikke indeholde nogen kode.

For at sætte initieringskoden (ikke kun kode for at initialisere egenskaber) bruges initialiseringsblok. Det er forud for initnøgleordet. Lad os ændre ovenstående eksempel med initialiseringsblok:

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

Når du kører programmet, vil output være:

 First Name = Joe Age = 25

Her accepterer parametre fName og personAge inden for parentesen værdier "Joe"og 25henholdsvis når person1-objekt oprettes. Imidlertid bruges fName og personAge uden at bruge vareller val, og er ikke egenskaber for Personklassen.

Den Personklasse har to ejendomme fornavn og alder deklareres.

Når person1objekt oprettes, udføres kode inden i initialiseringsblokken. Initialiseringsblokken initialiserer ikke kun dens egenskaber, men udskriver dem også.

Her er en anden måde at udføre den samme opgave på:

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

For at skelne mellem konstruktørparameteren og egenskaben anvendes forskellige navne (fName og firstName, and personAge and age). Det er mere almindeligt at bruge _firstName og _age i stedet for et helt andet navn til konstruktorparametre. For eksempel:

 klasse Person (_firstName: String, _age: Int) (val firstName = _firstName.capitalize () var age = _age // initializer block init (…)) 

Standardværdi i primær konstruktør

Du kan angive konstruktorparametre som standardværdi (svarer til at levere standardargumenter til funktioner). For eksempel:

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

Når du kører programmet, vil output være:

 Fornavn = Joe Alder = 25 person2 instantieres Fornavn = Jack Alder = 0 person3 instantieres Fornavn = Ukendt Alder = 0

Kotlin Secondary Constructor

I Kotlin kan en klasse også indeholde en eller flere sekundære konstruktører. De oprettes ved hjælp af constructornøgleord.

Sekundære konstruktører er ikke så almindelige i Kotlin. Den mest almindelige brug af sekundær konstruktør kommer op, når du har brug for at udvide en klasse, der giver flere konstruktører, der initialiserer klassen på forskellige måder. Sørg for at kontrollere Kotlin Arv, før du lærer det.

Sådan opretter du en sekundær konstruktør i Kotlin:

 klasse Log (konstruktør (data: String) (// noget kode) konstruktør (data: String, numberOfData: Int) (// noget kode))

Her har Logklassen to sekundære konstruktører, men ingen primær konstruktør.

Du kan udvide klassen som:

 klasse Log (konstruktør (data: String) (// kode) konstruktør (data: String, numberOfData: Int) (// kode)) klasse AuthLog: Log (konstruktør (data: String): super (data) (// kode ) konstruktør (data: String, numberOfData: Int): super (data, numberOfData) (// code))

Her AuthLogkalder konstruktører af den afledte klasse den tilsvarende konstruktør for basisklassen Log. Til det super()bruges.

I Kotlin kan du også ringe til en konstruktør fra en anden konstruktør af samme klasse (som i Java) ved hjælp af this().

 klasse AuthLog: Log (konstruktør (data: String): denne (data, 10) (// kode) konstruktør (data: String, numberOfData: Int): super (data, numberOfData) (// code)) 

Eksempel: Kotlin Secondary Constructor

 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) ( ) )

Når du kører programmet, vil output være:

 Fra AuthLog -> Dårlig adgangskode: 10 gange

Bemærk: Den sekundære konstruktør skal initialisere basisklassen eller delegere til en anden konstruktør (som i eksemplet ovenfor), hvis klassen ikke har nogen primær konstruktør.

Interessante artikler...