Middle
Na czym polega cecha delegatów właściwości?
sobes.tech AI
Odpowiedź od AI
Delegaty właściwości w Kotlinie pozwalają na przeniesienie logiki pobierania i ustawiania wartości właściwości do osobnej klasy pomocniczej zwanej delegatem.
Cechy:
-
Zrozumienie
getValueisetValue: Dla właściwości dostępnych do odczytu (val) delegat musi mieć metodęgetValue. Dla właściwości dostępnych do odczytu i zapisu (var) delegat musi mieć zarównogetValue, jak isetValue. Metody te przyjmują jako parametry:- Referencję do obiektu zawierającego właściwość (dla członków klasy).
- Metadane właściwości w postaci obiektu
KProperty.
-
Standardowe delegaty: Kotlin dostarcza szereg standardowych delegatów:
lazy: do opóźnionej inicjalizacji właściwości.observable: do wykonywania określonej akcji przy zmianie wartości właściwości.vetoable: do wykonywania akcji przy zmianie wartości właściwości z możliwością jej anulowania.- Delegaty dla map: Właściwość może być przechowywana w
Map.
-
Dowolne delegaty: Można tworzyć własne klasy delegatów. Klasa musi implementować interfejsy
ReadOnlyProperty(dlaval) lubReadWriteProperty(dlavar).
Przykład użycia lazy:
// Pole jest inicjalizowane tylko przy pierwszym dostępie
val lazyValue: String by lazy {
println("Obliczam wartość")
"Hello"
}
Przykład użycia observable:
import kotlin.properties.Delegates
var name: String by Delegates.observable("<brak nazwy>") {
property, oldValue, newValue ->
println("$oldValue -> $newValue")
}
Przykład własnego delegata:
import kotlin.reflect.KProperty
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, wartość właściwości '${property.name}'"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$thisRef, wartość właściwości '${property.name}' została zmieniona na '$value'")
}
}
class Example {
var p: String by Delegate()
}