Sobes.tech
Middle

V čom spočíva vlastnosť delegátov vlastností?

sobes.tech AI

Odpoveď od AI

Delegáty vlastností v Kotlin umožňujú presunúť logiku získavania a nastavovania hodnoty vlastnosti na samostatnú pomocnú triedu nazývanú delegát.

Charakteristiky:

  1. Porozumenie getValue a setValue: Pre vlastnosti dostupné na čítanie (val) musí delegát mať metódu getValue. Pre vlastnosti dostupné na čítanie a zápis (var) musí delegát mať obe getValue a setValue. Tieto metódy prijímajú ako parametre:

    • Referenciu na objekt obsahujúci vlastnosť (pre členov triedy).
    • Metadata vlastnosti vo forme objektu KProperty.
  2. Štandardné delegáty: Kotlin prichádza s radom štandardných delegátov:

    • lazy: Pre oneskorenú inicializáciu vlastnosti.
    • observable: Pre vykonanie určitej akcie pri zmene hodnoty vlastnosti.
    • vetoable: Pre vykonanie akcie pri zmene hodnoty vlastnosti s možnosťou zrušiť zmenu.
    • Delegáty pre mapy: Vlastnosť môže byť uložená v Map.
  3. Libovolné delegáty: Môžete vytvárať vlastné triedy delegátov. Trieda musí implementovať rozhrania ReadOnlyProperty (pre val) alebo ReadWriteProperty (pre var).

Príklad použitia lazy:

// Pole sa inicializuje iba pri prvom prístupe
val lazyValue: String by lazy { 
    println("Vypočítavam hodnotu")
    "Hello"
}

Príklad použitia observable:

import kotlin.properties.Delegates

var name: String by Delegates.observable("<žiadne meno>") {
    property, oldValue, newValue ->
    println("$oldValue -> $newValue")
}

Príklad vlastného delegáta:

import kotlin.reflect.KProperty

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, hodnota vlastnosti '${property.name}'"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$thisRef, hodnota vlastnosti '${property.name}' bola zmenená na '$value'")
    }
}

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