Sobes.tech
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().

Σειρά αρχικοποίησης:

  1. Εκτέλεση του κώδικα του πρωτεύοντος κατασκευαστή (αν υπάρχει).
  2. Εκτέλεση των μπλοκ init με τη σειρά που δηλώνονται.
  3. Εκτέλεση του κώδικα του δευτερεύοντος κατασκευαστή (αν χρησιμοποιείται).

Παράδειγμα:

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 για λογική αρχικοποίησης, ρητή αναθέτηση σε δευτερεύοντες κατασκευαστές για διασφάλιση συνέπειας στη δημιουργία αντικειμένων.