Sobes.tech
Middle

Мүлк өкүлдөрүнүн өзгөчөлүгү эмнеде?

sobes.tech AI

AIден жооп

Kotlinтеги мүлктүк делегаттары мүлктүн алуу жана коюу логикасын өзүнчө жардамчы класска өткөрүүгө мүмкүндүк берет, ал делегат деп аталат (https://kotlinlang.org/docs/delegation.html).

Мүнөздөмөлөр:

  1. getValue жана setValue түшүнүгү: Окула турган мүлктөр үчүн (val) делегат getValue методуна ээ болушу керек. Окула жана жазыла турган мүлктөр үчүн (var) делегат getValue жана setValue методдорун камтышы керек. Бул методдор параметрлер катары:

    • мүлк камтыган объектке шилтемени.
    • KProperty объектисинде мүлктүн метадаты.
  2. Стандарттык делегаттар: Kotlin бир катар стандарттык делегаттарды камсыз кылат:

    • lazy: мүлктүн кечиктирилген инициализациясы үчүн.
    • observable: мүлктүн мааниси өзгөргөндө белгилүү бир ишти аткаруу үчүн.
    • vetoable: мүлктүн мааниси өзгөргөндө белгилүү бир ишти аткаруу жана өзгөрүүнү жокко чыгуу мүмкүнчүлүгү менен.
    • Карта үчүн делегаттар: мүлк Map ичинде сакталат.
  3. Ар кандай делегаттар: Өзгөчө делегат класстарды түзүүгө болот. Класс ReadOnlyProperty (val үчүн) же ReadWriteProperty (var үчүн) интерфейстерин ишке ашырышы керек.

lazy колдонуу мисалы:

// Алгачкы кирүүдө гана инициализацияланат
val lazyValue: String by lazy { 
    println("Маани эсептелүүдө")
    "Hello"
}

observable колдонуу мисалы:

import kotlin.properties.Delegates

var name: String by Delegates.observable("<аты жок>") {
    property, oldValue, newValue ->
    println("$oldValue -> $newValue")
}

Колдонуучу аныктаган делегат мисалы:

import kotlin.reflect.KProperty

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, мүлктүн аты '${property.name}'"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$thisRef, мүлктүн '${property.name}' мааниси өзгөрдү — '$value'")
    }
}

class Example {
    var p: String by Delegate()
}