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:
-
Porozumění
getValueasetValue: Pro vlastnosti dostupné ke čtení (val) musí delegát mít metodugetValue. Pro vlastnosti dostupné ke čtení i zápisu (var) musí delegát mít jakgetValue, taksetValue. Tyto metody přijímají jako parametry:- Odkaz na objekt obsahující vlastnost (pro členy třídy).
- Metadata vlastnosti ve formě objektu
KProperty.
-
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.
-
Libovolné delegáty: Můžete vytvářet vlastní třídy delegátů. Třída musí implementovat rozhraní
ReadOnlyProperty(proval) neboReadWriteProperty(provar).
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()
}