Kotlin konstruktører og initialiseringer (med eksempler)

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.

Interessante artikler...