Sobes.tech
Middle

V čem spočívá zvláštnost delegátů vlastností?

sobes.tech AI

Odpověď od AI

Delegáty vlastností v Kotlinu umožňují přesunout logiku získávání a nastavování hodnoty vlastnosti na samostatnou pomocnou třídu nazývanou delegát.

Vlastnosti:

  1. Porozumění getValue a setValue: Pro vlastnosti dostupné ke čtení (val) musí delegát mít metodu getValue. Pro vlastnosti dostupné ke čtení i zápisu (var) musí delegát mít jak getValue, tak setValue. Tyto metody přijímají jako parametry:

    • Odkaz na objekt obsahující vlastnost (pro členy třídy).
    • Metadata vlastnosti ve formě objektu KProperty.
  2. Standardní delegáty: Kotlin přichází s řadou standardních delegátů:

    • lazy: Pro odloženou inicializaci vlastnosti.
    • observable: Pro provedení určité akce při změně hodnoty vlastnosti.
    • vetoable: Pro provedení akce při změně hodnoty vlastnosti s možností zrušení změny.
    • Delegáty pro mapy: Vlastnost může být uložena v Map.
  3. Libovolné delegáty: Můžete vytvářet vlastní třídy delegátů. Třída musí implementovat rozhraní ReadOnlyProperty (pro val) nebo ReadWriteProperty (pro var).

Příklad použití lazy:

// Pole je inicializováno pouze při prvním přístupu
val lazyValue: String by lazy { 
    println("Vypočítávám hodnotu")
    "Hello"
}

Příklad použití observable:

import kotlin.properties.Delegates

var name: String by Delegates.observable("<bez jména>") {
    property, oldValue, newValue ->
    println("$oldValue -> $newValue")
}

Pří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}' změněna na '$value'")
    }
}

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