Middle
Ποια είναι τα χαρακτηριστικά της εργασίας με κατασκευαστές και αρχικοποίηση αντικειμένων σε Kotlin;
sobes.tech AI
Απάντηση από AI
Στην Kotlin, οι κλάσεις μπορούν να έχουν έναν πρωτεύοντα κατασκευαστή και έναν ή περισσότερους δευτερεύοντες κατασκευαστές.
Πρωτεύων κατασκευαστής:
- Δηλώνεται στην επικεφαλίδα της κλάσης:
class User(val name: String, var age: Int = 0) { // σώμα της κλάσης } - Δεν έχει σώμα. Ο κώδικας αρχικοποίησης εκτελείται στα μπλοκ
init. - Οι ιδιότητες που δηλώνονται στον πρωτεύοντα κατασκευαστή με
valήvarγίνονται ιδιότητες της κλάσης. - Μπορείτε να χρησιμοποιήσετε τις παραμέτρους του κατασκευαστή στα μπλοκ
initκαι κατά την αρχικοποίηση ιδιοτήτων:init { println("Αρχικοποίηση χρήστη $name") } val description = "Χρήστης: $name, ηλικία: $age" - Αν ο πρωτεύων κατασκευαστής δεν έχει annotations ή modifiers ορατότητας, η λέξη
constructorμπορεί να παραλειφθεί.
Μπλοκ init:
- Περιέχουν κώδικα αρχικοποίησης που εκτελείται κατά τη δημιουργία ενός στιγμιότυπου της κλάσης.
- Εκτελούνται με τη σειρά που δηλώνονται.
- Εκτελούνται μετά την κλήση του πρωτεύοντος κατασκευαστή (αν υπάρχει), αλλά πριν τους δευτερεύοντες κατασκευαστές.
Δευτερεύοντες κατασκευαστές:
- Δηλώνονται με τη λέξη
constructor. - Μπορούν να αναθέσουν την κλήση σε άλλον κατασκευαστή της ίδιας κλάσης με
this()ή στον κατασκευαστή της βασικής κλάσης μεsuper(). Η κλήση αναθέσεων πρέπει να είναι η πρώτη εντολή.class User(val name: String) { constructor(name: String, age: Int) : this(name) { println("Δευτερεύων κατασκευαστής") // πρόσθετη λογική αρχικοποίησης } } - Αν η κλάση έχει πρωτεύοντα κατασκευαστή, όλοι οι δευτερεύοντες κατασκευαστές πρέπει να αναθέτουν ρητά ή σιωπηρά σε αυτόν μέσω
this().
Σειρά αρχικοποίησης:
- Εκτέλεση του κώδικα του πρωτεύοντος κατασκευαστή (αν υπάρχει).
- Εκτέλεση των μπλοκ
initμε τη σειρά που δηλώνονται. - Εκτέλεση του κώδικα του δευτερεύοντος κατασκευαστή (αν χρησιμοποιείται).
Παράδειγμα:
class Example(name: String) {
init {
println("Πρώτο μπλοκ init για $name")
}
val property1 = "Ιδιότητα 1"
init {
println("Δεύτερο μπλοκ init για $name")
}
constructor(name: String, age: Int) : this(name) {
println("Δευτερεύων κατασκευαστής για $name, ηλικία $age")
}
}
fun main() {
val ex1 = Example("Χρήστης1") // Θα εμφανίσει: Πρώτο μπλοκ init για Χρήστης1, Δεύτερο μπλοκ init για Χρήστης1
val ex2 = Example("Χρήστης2", 30) // Θα εμφανίσει: Πρώτο μπλοκ init για Χρήστης2, Δεύτερο μπλοκ init για Χρήστης2, Δευτερεύων κατασκευαστής για Χρήστης2, ηλικία 30
}
Κύρια χαρακτηριστικά: δηλωτική σύνταξη του πρωτεύοντος κατασκευαστή, χρήση των μπλοκ init για λογική αρχικοποίησης, ρητή αναθέτηση σε δευτερεύοντες κατασκευαστές για διασφάλιση συνέπειας στη δημιουργία αντικειμένων.