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 Person
klassen er opprettet, "Joe"
og 25
verdiene overføres som om det Person
er en funksjon.
Dette initialiseres firstName
og age
egenskaper av menneske1 objekt til "Joe"
og 25
respektivt.
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 init
nø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 25
henholdsvis når person1-objekt opprettes. Imidlertid brukes fName og personAge uten å bruke var
eller val
, og er ikke egenskaper for Person
klassen.
Den Person
klassen har to egenskaper fornavn og alder blir vedtatt.
Når person1
objektet 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 constructor
nø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 Log
klassen 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 AuthLog
kaller 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.