I denne artikkelen vil du lære om konstruktører i Kotlin (både primære og sekundære konstruktører) samt initialiseringsblokker ved hjelp av eksempler.
En konstruktør er en kortfattet måte å initialisere klasseegenskaper på.
Det er en spesiell medlemsfunksjon som kalles når et objekt blir instantiert (opprettet). Hvordan de jobber i Kotlin er imidlertid litt annerledes.
I Kotlin er det to konstruktører:
- Primær konstruktør - kortfattet måte å initialisere en klasse på
- Sekundær konstruktør - lar deg sette i tillegg initialiseringslogikk
Primær konstruktør
Primærkonstruktøren er en del av kursoverskriften. Her er et eksempel:
klasse Person (val firstName: String, var age: Int) (// class body)
Kodeblokken som er omgitt av parenteser er den primære konstruktøren: (val firstName: String, var age: Int).
Konstruktøren erklærte to egenskaper: firstName(skrivebeskyttet eiendom som den er erklært ved hjelp av nøkkelord val) og age(lese-skrive-egenskap som den blir erklært med nøkkelord var).
Eksempel: Primærkonstruktø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 kjører programmet, vil utdataene være:
Fornavn = Joe Alder = 25
Når objektet til Personklassen er opprettet, "Joe"og 25verdiene overføres som om det Personer en funksjon.
Dette initialiseres firstNameog ageegenskaper av menneske1 objekt til "Joe"og 25respektivt.
Det er andre måter å bruke primærkonstruktører på.
Primære konstruktør- og initialiseringsblokker
Primærkonstruktøren har en begrenset syntaks og kan ikke inneholde noen kode.
For å sette initieringskoden (ikke bare kode for å initialisere egenskaper), brukes initialiseringsblokk. Det er prefikset med initnøkkelord. La oss endre eksemplet ovenfor med initialiseringsblokk:
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 kjører programmet, vil utdataene være:
First Name = Joe Age = 25
Her godtar parametere fName og personAge i parentes verdier "Joe"og 25henholdsvis når person1-objekt opprettes. Imidlertid brukes fName og personAge uten å bruke vareller val, og er ikke egenskaper for Personklassen.
Den Personklassen har to egenskaper fornavn og alder blir vedtatt.
Når person1objektet opprettes, kjøres koden i initialiseringsblokken. Initialiseringsblokken initialiserer ikke bare egenskapene, men skriver dem også ut.
Her er en annen måte å utføre den samme oppgaven 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 å skille mellom konstruktørparameteren og -egenskapen brukes forskjellige navn (fnavn og fornavn, og personAge og alder). Det er mer vanlig å bruke _firstName og _age i stedet for helt annet navn for konstruktorparametere. For eksempel:
klasse Person (_firstName: String, _age: Int) (val firstName = _firstName.capitalize () var age = _age // initializer block init (…))
Standardverdi i primær konstruktør
Du kan gi standardverdi til konstruktorparametere (ligner på å gi standardargumenter til funksjoner). 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 kjører programmet, vil utdataene være:
Fornavn = Joe Alder = 25 person2 er instantiert Fornavn = Jack Alder = 0 person3 er instantiert Fornavn = Ukjent Alder = 0
Kotlin Secondary Constructor
I Kotlin kan en klasse også inneholde en eller flere sekundære konstruktører. De er opprettet ved hjelp av constructornøkkelord.
Sekundære konstruktører er ikke så vanlige i Kotlin. Den vanligste bruken av sekundær konstruktør kommer opp når du trenger å utvide en klasse som gir flere konstruktører som initialiserer klassen på forskjellige måter. Husk å sjekke Kotlin Arv før du lærer det.
Slik kan du lage en sekundær konstruktør i Kotlin:
class Log (constructor (data: String) (// some code) constructor (data: String, numberOfData: Int) (// some code))
Her har Logklassen to sekundære konstruktører, men ingen primærkonstruktører.
Du kan utvide klassen som:
class Log (constructor (data: String) (// code) constructor (data: String, numberOfData: Int) (// code)) class AuthLog: Log (constructor (data: String): super (data) (// code ) konstruktør (data: String, numberOfData: Int): super (data, numberOfData) (// code))
Her AuthLogkaller konstruktører av den avledede klassen den tilsvarende konstruktøren til baseklassen Log. For det super()brukes.

I Kotlin kan du også ringe en konstruktør fra en annen konstruktør i samme klasse (som i Java) ved hjelp av this().
klasse AuthLog: Logg (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 kjører programmet, vil utdataene være:
Fra AuthLog -> Dårlig passord: 10 ganger
Merk: Den sekundære konstruktøren må initialisere basisklassen eller delegere til en annen konstruktør (som i eksemplet ovenfor) hvis klassen ikke har noen primærkonstruktør.








