Sobes.tech
Middle

Мүлік делегаттарының ерекшелігі неде?

sobes.tech AI

AI-дан жауап

Kotlin-те қасиеттер делегаттары қасиеттің мәнін алу және орнату логикасын бөлек көмекші класске жүктеуге мүмкіндік береді, ол делегат деп аталады.

Артықшылықтары:

  1. getValue және setValue түсінігі: Оқу үшін қол жетімді қасиеттер (val) үшін делегат getValue әдісін жүзеге асыруы керек. Оқу және жазу үшін қол жетімді қасиеттер (var) үшін делегат getValue және setValue әдістерін жүзеге асыруы керек. Бұл әдістер параметр ретінде:

    • Қасиетті қамтитын объектке сілтеме (сынып мүшелері үшін).
    • KProperty объекті түрінде қасиет метадаты.
  2. Стандартты делегаттар: Kotlin бірнеше стандартты делегаттарды ұсынады:

    • lazy: қасиеттің кешіктірілген инициализациясы үшін.
    • observable: қасиеттің мәні өзгерген кезде белгілі бір әрекетті орындау үшін.
    • vetoable: қасиеттің мәні өзгерген кезде әрекетті орындау және өзгерісті болдырмау мүмкіндігімен.
    • Map-қа арналған делегаттар: қасиет 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()
}