Sobes.tech
Middle

Kotlin-ში კონსტრუქტორებთან და ობიექტების ინიციალიზაციასთან მუშაობის მახასიათებლები რა არის?

sobes.tech AI

პასუხი AI-სგან

Котлинде класслар негизги конструктор жана бир нече же бир нече экинчи конструкторлорду камтышы мүмкүн.

Негизги конструктор:

  • Класс башында жарыяланат:
    class User(val аты: String, var жашы: Int = 0) {
        // класс денеси
    }
    
  • Тело жок. Инициализация коду init блокторунда аткарылат.
  • Негизги конструктордо val же var менен жарыяланган мүчөлөр класс мүчөлөрүнө айланат.
  • Конструктор параметрлерин init блокторунда жана мүчөлөрдү инициализациялоодо колдонсо болот:
    init {
        println("Колдонуучунун инициализациясы $аты")
    }
    
    val сүрөттөө = "Колдонуучу: $аты, жашы: $жашы"
    
  • Эгер негизги конструкторго аннотациялар же көрүүчүлүк модификаторлору жок болсо, constructor сөзүнөн кутулууга болот.

init блоктору:

  • Класс түзүлгөндө аткарылчу инициализация коду камтыйт.
  • Алар жарыяланган тартипте аткарылат.
  • Негизги конструктор чакырылган соң, бирок экинчи конструкторлордон мурда аткарылат.

Экинчи конструкторлор:

  • constructor сөзү менен жарыяланат.
  • Башка конструкторго this() же базалык класс конструкторуна super() аркылуу делегат кылышы мүмкүн. Делегат биринчи орунда болушу керек.
    class User(val аты: String) {
        constructor(аты: String, жашы: Int) : this(аты) {
            println("Экинчи конструктор")
            // кошумча инициализация логикасы
        }
    }
    
  • Эгер класс негизги конструкторго ээ болсо, бардык экинчи конструкторлор аны ачык же кыйыр түрдө this() аркылуу делегат кылышы керек.

Инициализациянын тартиби:

  1. Негизги конструктордун коду аткарылат (эгер бар болсо).
  2. init блоктору алардын жарыялануу тартибинде аткарылат.
  3. Экинчи конструктордун коду аткарылат (эгер колдонулса).

Мисал:

class Example(аты: String) {
    init {
        println("Биринчи init блогу $аты")
    }

    val өзгөчөлүк1 = "Өзгөчөлүк 1"

    init {
        println("Экинчи init блогу $аты")
    }

    constructor(аты: String, жашы: Int) : this(аты) {
        println("Экинчи конструктор $аты, жашы $жашы")
    }
}

fun main() {
    val ex1 = Example("Колдонуучу1") // Чыгуу: Биринчи init блогу Колдонуучу1, Экинчи init блогу Колдонуучу1
    val ex2 = Example("Колдонуучу2", 30) // Чыгуу: Биринчи init блогу Колдонуучу2, Экинчи init блогу Колдонуучу2, Экинчи конструктор Колдонуучу2, жашы 30
}

Негизги өзгөчөлүктөрү: декларативдүү синтаксис негизги конструктор үчүн, init блокторун колдонуу инициализация логикасы үчүн, жана экинчи конструкторлордо делегаттоо объекттердин түзүлүшүнүн туруктуулугун камсыз кылуу үчүн ачык түрдө жүргүзүлөт.