Мүлік делегаттарының ерекшелігі неде?
sobes.tech AI
AI-дан жауап
Kotlin-те қасиеттер делегаттары қасиеттің мәнін алу және орнату логикасын бөлек көмекші класске жүктеуге мүмкіндік береді, ол делегат деп аталады.
Артықшылықтары:
-
getValueжәнеsetValueтүсінігі: Оқу үшін қол жетімді қасиеттер (val) үшін делегатgetValueәдісін жүзеге асыруы керек. Оқу және жазу үшін қол жетімді қасиеттер (var) үшін делегатgetValueжәнеsetValueәдістерін жүзеге асыруы керек. Бұл әдістер параметр ретінде:- Қасиетті қамтитын объектке сілтеме (сынып мүшелері үшін).
KPropertyобъекті түрінде қасиет метадаты.
-
Стандартты делегаттар: Kotlin бірнеше стандартты делегаттарды ұсынады:
lazy: қасиеттің кешіктірілген инициализациясы үшін.observable: қасиеттің мәні өзгерген кезде белгілі бір әрекетті орындау үшін.vetoable: қасиеттің мәні өзгерген кезде әрекетті орындау және өзгерісті болдырмау мүмкіндігімен.- Map-қа арналған делегаттар: қасиет
Mapішінде сақталуы мүмкін.
-
Өздігінен делегаттар: Өз делегат сыныптарын жасауға болады. Сынып
ReadOnlyProperty(текvalүшін) немесеReadWriteProperty(varүшін) интерфейстерін жүзеге асыруы керек.
lazy қолдану мысалы:
// Алғашқы рет қол жеткенде ғана инициализацияланады
val lazyValue: String by lazy {
println("Мән есептелуде")
"Hello"
}
observable қолдану мысалы:
import kotlin.properties.Delegates
var name: String by Delegates.observable("<аты жоқ>") {
property, oldValue, newValue ->
println("$oldValue -> $newValue")
}
Пайдаланушы делегатының мысалы:
import kotlin.reflect.KProperty
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, қасиет атауы '${property.name}'"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$thisRef, қасиет '${property.name}' мәні '$value' деп өзгертілді")
}
}
class Example {
var p: String by Delegate()
}