Î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"
}
Î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.