Sobes.tech
Middle

Kāda ir īpašību deleģentu īpatnība?

sobes.tech AI

Atbilde no AI

Kotlin īpašību deleģāti ļauj pārlikt īpašības iegūšanas un iestatīšanas loģiku uz atsevišķu palīgklasi, ko sauc par deleģātu.

Īpašību īpašības:

  1. getValue un setValue sapratne: Lasāmajām īpašībām (val) deleģātam jābūt getValue metodēm. Lasāmajām un rakstāmajām īpašībām (var) deleģātam jābūt gan getValue, gan setValue. Šīs metodes pieņem kā parametrus:

    • atsauci uz objektu, kas satur īpašību (klases locekļi).
    • KProperty objekta metadatus.
  2. Standarta deleģāti: Kotlin ir pieejami vairāki standarta deleģāti:

    • lazy: īpašības aizkavēta inicializācija.
    • observable: darbība, kas tiek veikta, mainot īpašības vērtību.
    • vetoable: darbība, kas tiek veikta, mainot īpašības vērtību ar iespēju atteikties no izmaiņām.
    • Map deleģāti: īpašība var tikt glabāta Map objektā.
  3. Pašizveidoti deleģāti: Var izveidot savas klases deleģātus. Klasei jāīsteno ReadOnlyProperty (val) vai ReadWriteProperty (var) saskarnes.

lazy piemērs:

// Laukums tiek inicializēts tikai pirmās piekļuves laikā
val lazyValue: String by lazy { 
    println("Aprēķinu vērtību")
    "Hello"
}

observable piemērs:

import kotlin.properties.Delegates

var name: String by Delegates.observable("<nav nosaukts>") {
    property, oldValue, newValue ->
    println("$oldValue -> $newValue")
}

Lietotāja izveidots deleģāts:

import kotlin.reflect.KProperty

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, īpašības '${property.name}' vērtība"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$thisRef, īpašības '${property.name}' vērtība mainīta uz '$value'")
    }
}

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