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()
}