Κατασκευαστές και αρχικοποιητές Kotlin (με παραδείγματα)

Σε αυτό το άρθρο, θα μάθετε για τους κατασκευαστές στο Kotlin (τόσο πρωτογενείς όσο και δευτερεύοντες κατασκευαστές) καθώς και για μπλοκ προετοιμασίας με τη βοήθεια παραδειγμάτων.

Ένας κατασκευαστής είναι ένας συνοπτικός τρόπος αρχικοποίησης ιδιοτήτων κλάσης.

Είναι μια ειδική συνάρτηση μέλους που καλείται όταν ένα αντικείμενο δημιουργείται (δημιουργείται). Ωστόσο, ο τρόπος που εργάζονται στο Kotlin είναι ελαφρώς διαφορετικός.

Στο Kotlin, υπάρχουν δύο κατασκευαστές:

  • Πρωτοβάθμιος κατασκευαστής - συνοπτικός τρόπος αρχικοποίησης μιας τάξης
  • Δευτερεύων κατασκευαστής - σας επιτρέπει να βάλετε επιπλέον λογική προετοιμασίας

Πρωταρχικός Κατασκευαστής

Ο κύριος κατασκευαστής είναι μέρος της κεφαλίδας της τάξης. Ακολουθεί ένα παράδειγμα:

 class person (val firstName: String, var age: Int) (// τάξη σώμα)

Το μπλοκ του κώδικα που περιβάλλεται από παρενθέσεις είναι ο πρωταρχικός κατασκευαστή: (val firstName: String, var age: Int).

Ο κατασκευαστής δήλωσε δύο ιδιότητες: firstName(ιδιότητα μόνο για ανάγνωση όπως δηλώνεται χρησιμοποιώντας λέξη-κλειδί val) και age(ιδιότητα ανάγνωσης-εγγραφής όπως δηλώνεται με λέξη-κλειδί var).

Παράδειγμα: Κύριος κατασκευαστής

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

Όταν εκτελείτε το πρόγραμμα, η έξοδος θα είναι:

 Όνομα = Joe Ηλικία = 25

Όταν δημιουργείται το αντικείμενο της Personκλάσης "Joe"και οι 25τιμές περνούν σαν να Personείναι μια συνάρτηση.

Αυτό αρχικοποιεί firstNameκαι ageιδιότητες του αντικειμένου person1 "Joe"και 25αντίστοιχα.

Υπάρχουν άλλοι τρόποι χρήσης πρωτογενών κατασκευαστών.

Κύρια μπλοκ κατασκευαστή και αρχικοποιητή

Ο κύριος κατασκευαστής έχει περιορισμένη σύνταξη και δεν μπορεί να περιέχει κώδικα.

Για να βάλετε τον κώδικα initilization (όχι μόνο τον κωδικό για την αρχικοποίηση των ιδιοτήτων), χρησιμοποιείται το μπλοκ αρχικοποίησης. Πρόθεμα με initλέξη-κλειδί. Ας τροποποιήσουμε το παραπάνω παράδειγμα με το μπλοκ αρχικοποίησης:

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

Όταν εκτελείτε το πρόγραμμα, η έξοδος θα είναι:

 First Name = Joe Age = 25

Εδώ, οι παράμετροι fName και personAge μέσα στην παρένθεση δέχονται τιμές "Joe"και 25αντίστοιχα όταν δημιουργείται το αντικείμενο person1. Ωστόσο, το fName και το personAge χρησιμοποιούνται χωρίς τη χρήση varή val, και δεν αποτελούν ιδιότητες της Personκλάσης.

Η Personτάξη έχει δύο ιδιότητες firstName και δηλώνεται η ηλικία.

Όταν person1δημιουργείται αντικείμενο, εκτελείται κώδικας στο μπλοκ αρχικοποιητή. Το μπλοκ αρχικοποιητή όχι μόνο αρχικοποιεί τις ιδιότητές του αλλά και τις εκτυπώνει.

Εδώ είναι ένας άλλος τρόπος για να εκτελέσετε την ίδια εργασία:

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

Για τη διάκριση της παραμέτρου κατασκευαστή και της ιδιότητας, χρησιμοποιούνται διαφορετικά ονόματα (fName και firstName και personAge και age) Είναι πιο συνηθισμένο να χρησιμοποιείτε _firstName και _age αντί εντελώς διαφορετικού ονόματος για παραμέτρους κατασκευαστή. Για παράδειγμα:

 class class (_firstName: String, _age: Int) (val firstName = _firstName.capitalize () var age = _age // αρχικοποιητής μπλοκ init (…)) 

Προεπιλεγμένη τιμή στον Κύριο Κατασκευαστή

Μπορείτε να παρέχετε προεπιλεγμένη τιμή σε παραμέτρους κατασκευαστή (παρόμοια με την παροχή προεπιλεγμένων ορισμάτων σε συναρτήσεις). Για παράδειγμα:

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

Όταν εκτελείτε το πρόγραμμα, η έξοδος θα είναι:

 Όνομα = Joe Age = 25 person2 είναι instantated Όνομα = Jack Age = 0 person3 είναι instantiated Όνομα = ΑΓΝΩΣΗ Ηλικία = 0

Δευτερεύων κατασκευαστής Kotlin

Στο Kotlin, μια τάξη μπορεί επίσης να περιέχει έναν ή περισσότερους δευτερεύοντες κατασκευαστές. Δημιουργούνται χρησιμοποιώντας constructorλέξη-κλειδί.

Οι δευτερεύοντες κατασκευαστές δεν είναι τόσο συνηθισμένοι στο Kotlin. Η πιο συνηθισμένη χρήση του δευτερεύοντος κατασκευαστή εμφανίζεται όταν πρέπει να επεκτείνετε μια τάξη που παρέχει πολλούς κατασκευαστές που αρχικοποιούν την κλάση με διαφορετικούς τρόπους. Φροντίστε να ελέγξετε το Kotlin Inheritance προτού το μάθετε.

Δείτε πώς μπορείτε να δημιουργήσετε έναν δευτερεύοντα κατασκευαστή στο Kotlin:

 class log (κατασκευαστής (δεδομένα: String) (// some code) κατασκευαστής (δεδομένα: String, numberOfData: Int) (// some code))

Εδώ, η Logτάξη έχει δύο δευτερεύοντες κατασκευαστές, αλλά δεν έχει έναν κύριο κατασκευαστή.

Μπορείτε να επεκτείνετε την τάξη ως:

 class Log (κατασκευαστής (δεδομένα: String) (// κωδικός) κατασκευαστής (δεδομένα: String, numberOfData: Int) (// code)) class AuthLog: Log (κατασκευαστής (δεδομένα: String): super (data) (// κωδικός ) κατασκευαστής (δεδομένα: συμβολοσειρά, numberOfData: Int): super (data, numberOfData) (// code))

Εδώ, οι κατασκευαστές της παραγόμενης κλάσης AuthLogκαλούν τον αντίστοιχο κατασκευαστή της βασικής κλάσης Log. Για αυτό, super()χρησιμοποιείται.

Στο Kotlin, μπορείτε επίσης να καλέσετε έναν κατασκευαστή από άλλον κατασκευαστή της ίδιας κλάσης (όπως στην Java) χρησιμοποιώντας this().

 class AuthLog: Log (κατασκευαστής (δεδομένα: συμβολοσειρά): αυτό (δεδομένα, 10) (// κωδικός) κατασκευαστής (δεδομένα: συμβολοσειρά, numberOfData: Int): super (data, numberOfData) (// code)) 

Παράδειγμα: Δευτερεύων κατασκευαστής Kotlin

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

Όταν εκτελείτε το πρόγραμμα, η έξοδος θα είναι:

 Από AuthLog -> Bad Password: 10 φορές

Σημείωση: Ο δευτερεύων κατασκευαστής πρέπει να προετοιμάσει την βασική κλάση ή να μεταβιβάσει σε άλλο κατασκευαστή (όπως στο παραπάνω παράδειγμα) εάν η κλάση δεν έχει πρωτεύοντα κατασκευαστή.

ενδιαφέροντα άρθρα...