Sobes.tech
Middle

Care este caracteristica delegaților de proprietăți?

sobes.tech AI

Răspuns de la AI

Delegarea proprietăților în Kotlin permite transferul logicii de obținere și setare a valorii unei proprietăți către o clasă auxiliară numită delegat.

Caracteristici:

  1. Înțelegerea getValue și setValue: Pentru proprietățile accesibile pentru citire (val), delegatul trebuie să aibă o metodă getValue. Pentru proprietățile accesibile pentru citire și scriere (var), delegatul trebuie să aibă atât getValue, cât și setValue. Aceste metode primesc ca parametri:

    • O referință la obiectul care conține proprietatea (pentru membrii clasei).
    • Metadatele proprietății sub forma unui obiect KProperty.
  2. Delegati standard: Kotlin vine cu o serie de delegați standard:

    • lazy: Pentru inițializarea întârziată a proprietății.
    • observable: Pentru a executa o acțiune la schimbarea valorii proprietății.
    • vetoable: Pentru a executa o acțiune la schimbarea valorii proprietății, cu posibilitatea de a anula schimbarea.
    • Delegatori pentru hărți: Proprietatea poate fi stocată într-un Map.
  3. Delegatori arbitrar: Se pot crea propriile clase delegat. Clasa trebuie să implementeze interfețele ReadOnlyProperty (pentru val) sau ReadWriteProperty (pentru var).

Exemplu de utilizare a lazy:

// Câmpul este inițializat doar la prima accesare
val lazyValue: String by lazy { 
    println("Calculând valoarea")
    "Hello"
}

Exemplu de utilizare a observable:

import kotlin.properties.Delegates

var name: String by Delegates.observable("<fără nume>") {
    property, oldValue, newValue ->
    println("$oldValue -> $newValue")
}

Exemplu de delegat personalizat:

import kotlin.reflect.KProperty

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, valoarea proprietății '${property.name}'"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$thisRef, valoarea proprietății '${property.name}' a fost schimbată în '$value'")
    }
}

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