Sobes.tech
Junior

Պատմեք Kotlin լեզվով դասերի ինիցիալիզատորների մասին։

sobes.tech AI

Պատասխան AI-ից

Կոտլինում դասերը կարող են ունենալ հիմնական և մեկ կամ մի քանի երկրորդական կոնստրուկտորներ: Ինիցիալիզատորները՝ դա init բլոկներն են, որոնք կատարվում են նրանց հայտարարության կարգով՝ հիմնական կոնստրուկտորից հետո (եթե կա) կամ երկրորդական կոնստրուկտորից հետո, եթե հիմնականը չկա:

Հիմնական կոնստրուկտոր

Նշվում է անմիջապես դասի վերնագրում: Կարող է պարունակել պարամետրեր, որոնք օգտագործվում են հատկությունների ինիցիալիզացման համար:

class User(name: String, age: Int) {
    init {
        // Այս բլոկը կատարվում է դասի օրինակ ստեղծելիս
        println("User created: $name, $age")
    }
}

Երկրորդական կոնստրուկտորներ

Նշվում են constructor բանալիով և միշտ պետք է դելեգատոր լինեն նույն դասի այլ կոնստրուկտորին, կամ հիմնականին (առանց this) կամ մյուս երկրորդականին:

class User {
    init {
        // Այս բլոկը կատարվում է առաջինը, եթե կա հիմնական կոնստրուկտոր
    }

    constructor(name: String) : this() {
        // Երկրորդական կոնստրուկտոր 1
        println("User created with name: $name")
    }

    constructor(name: String, age: Int) : this(name) {
        // Երկրորդական կոնստրուկտոր 2, կանչում է առաջին երկրորդականը
        println("User created with name and age: $name, $age")
    }
}

Կատարման կարգ

  1. Կոդը հիմնական կոնստրուկտորում (եթե պարամետրեր կան, օգտագործվում են)
  2. init բլոկները հերթով
  3. Կոդը այն երկրորդական կոնստրուկտորում, որը կանչվել է (հետո դելեգատորային կանչից)

Օրինակ կատարման կարգ:

class Example {
    init {
        println("Init block 1")
    }

    constructor(i: Int) {
        println("Secondary constructor $i")
    }

    init {
        println("Init block 2")
    }
}

fun main() {
    Example(10)
}

Արդյունք:

Init block 1
Init block 2
Secondary constructor 10

Անգամ եթե կանչվում է երկրորդական կոնստրուկտոր, init բլոկները միշտ կատարվում են նրա մարմնի առաջ: Սա ապահովում է, որ հիմնական ինիցիալիզացիան ավարտված է մինչև հատուկ կոդի կատարմանը երկրորդական կոնստրուկտորում:

Ինիցիալիզատորները անփոխարինելի են այն գործառույթների համար, որոնք պետք է կատարվեն ցանկացած օրինակ ստեղծելիս՝ անկախ այն բանից, թե որ կոնստրուկտորն է օգտագործվում: Օրինակ՝ մուտքային տվյալների ստուգում կամ օբյեկտի վիճակի կարգավորումը։