Мүлк өкүлдөрүнүн өзгөчөлүгү эмнеде?
sobes.tech AI
AIден жооп
Kotlinтеги мүлктүк делегаттары мүлктүн алуу жана коюу логикасын өзүнчө жардамчы класска өткөрүүгө мүмкүндүк берет, ал делегат деп аталат (https://kotlinlang.org/docs/delegation.html).
Мүнөздөмөлөр:
-
getValueжанаsetValueтүшүнүгү: Окула турган мүлктөр үчүн (val) делегатgetValueметодуна ээ болушу керек. Окула жана жазыла турган мүлктөр үчүн (var) делегатgetValueжанаsetValueметоддорун камтышы керек. Бул методдор параметрлер катары:- мүлк камтыган объектке шилтемени.
KPropertyобъектисинде мүлктүн метадаты.
-
Стандарттык делегаттар: Kotlin бир катар стандарттык делегаттарды камсыз кылат:
lazy: мүлктүн кечиктирилген инициализациясы үчүн.observable: мүлктүн мааниси өзгөргөндө белгилүү бир ишти аткаруу үчүн.vetoable: мүлктүн мааниси өзгөргөндө белгилүү бир ишти аткаруу жана өзгөрүүнү жокко чыгуу мүмкүнчүлүгү менен.- Карта үчүн делегаттар: мүлк
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()
}