Delegarea Proprietăților în Kotlin: by lazy, Delegates.observable și Delegare Personalizată în Kotlin

Ghid complet pentru Delegarea Proprietăților în Kotlin: inițializarea leneșă cu by lazy, monitorizarea modificărilor cu Delegates.observable și crearea de delegați personalizați prin operatorii getValue și setValue.

Sintaxă
val config: Config by lazy { ... } | var count by Delegates.observable(0) { ... }

În dezvoltarea software, logica din spatele accesării unei proprietăți (getter și setter) este frecvent repetitivă: inițializare leneșă la prima citire, salvarea într-un fișier de preferințe (SharedPreferences / DataStore), validarea valorilor înainte de atribuire sau notificarea observatorilor.

În loc să duplicăm această logică în zeci de clase, Kotlin introduce Delegarea Proprietăților (Delegated Properties) prin cuvântul cheie by, transferând responsabilitatea către un obiect delegat reutilizabil.

1. Inițializare Leneșă și Monitorizare cu Delegați Standard
import kotlin.properties.Delegates

class ServerConfig {
    // 1. by lazy: blocul lambda rulează STRICT la primul acces al proprietății;
    // valoarea este stocată în cache și returnată instantaneu la apelurile viitoare:
    val conexiuneGreoaie: String by lazy {
        println("Conectare la serverul de baze de date (operațiune lentă)...")
        "CONEXIUNE_ACTIVA_TCP_9092"
    }

    // 2. Delegates.observable: declanșează un callback la FIECARE modificare a proprietății:
    var volumAudio: Int by Delegates.observable(50) { proprietate, vecheaValoare, nouaValoare ->
        println("Proprietatea '${proprietate.name}' s-a schimbat: $vecheaValoare -> $nouaValoare")
    }

    // 3. Delegates.vetoable: poate RESPINGE o modificare dacă nu respectă o regulă de validare:
    var varsta: Int by Delegates.vetoable(18) { _, _, nouaVarsta ->
        nouaVarsta >= 0 // Dacă returnează false, atribuirea este anulată!
    }
}
2. Crearea unui Delegat Personalizat (Custom Delegate)
import kotlin.reflect.KProperty

// Un delegat custom trebuie doar să implementeze operatorul getValue (și setValue pentru 'var'):
class FormatareMajuscule(private var textInitial: String) {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return textInitial.uppercase()
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        textInitial = value.trim()
    }
}

class Utilizator {
    var titlu: String by FormatareMajuscule("administrator")
}

fun main() {
    val u = Utilizator()
    println(u.titlu) // Afișează automat: "ADMINISTRATOR"
    u.titlu = "   moderator   "
    println(u.titlu) // Afișează automat: "MODERATOR"
}
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Delegarea Proprietăților în Kotlin: by lazy, Delegates.observable și Delegare Personalizată

Ai o nelămurire despre utilizarea comenzii Delegarea Proprietăților în Kotlin: by lazy, Delegates.observable și Delegare Personalizată sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.