Sobes.tech
Middle

Kotlin'da delegatsiya nima?

sobes.tech AI

AIdan javob

Kotlin'da delegasiya, obyekt (delegat) boshqa obyekt nomidan ma'lum bir vazifani bajarish uchun javobgarlikni o'z zimmasiga oladigan dizayn shablonidir. Kotlin sintaksis darajasida nativ tarzda delegatsiyani qo'llab-quvvatlaydi.

Kotlin'da ikki asosiy delegatsiya turi mavjud:

  1. Sinf delegatsiyasi (Class Delegation): A sinfi interfeysni amalga oshirish imkonini beradi, bu interfeys metodlarining barcha chaqiruvlarini boshqa B ob'ektiga delegatsiya qiladi.

    interface Base {
        fun printMessage()
    }
    
    class BaseImpl(val x: Int) : Base {
        override fun printMessage() {
            // Interfeys metodining amalga oshirilishi
            println(x)
        }
    }
    
    class Derived(b: Base) : Base by b // Base sinfiga delegatsiya
    

    Misolda, Derived Base ning amalga oshirishini b ob'ektiga delegatsiya qiladi.

  2. Xususiyat delegatsiyasi (Delegated Properties): Bir xususiyatning olish va o'rnatish mantiqini boshqa ob'ektga delegatsiya qilish imkonini beradi. Kotlin bir nechta standart delegatlarni taqdim etadi:

    • lazy() kechiktirilgan boshlang'ich holat uchun.
      val lazyValue: String by lazy {
          // Faqat birinchi marta murojaat qilganda bajariladi
          println("hisoblanmoqda!")
          "Salom"
      }
      
    • Delegates.observable() o'zgarishlar haqida tinglovchilarni xabardor qilish uchun.
      import kotlin.properties.Delegates
      
      var name: String by Delegates.observable("initial qiymat") {
          prop, eski, yangi ->
          println("$eski -> $yangi")
      }
      
    • Delegates.vetoable() o'zgarishlarni ularni qo'llashdan oldin ushlash uchun.
      import kotlin.properties.Delegates
      
      var max: Int by Delegates.vetoable(0) {
          prop, eski, yangi -> yangi > eski
      }
      
    • Xarita (map) xususiyatlariga bog'lash uchun delegatlar.
      class User(val map: Map<String, Any?>) {
          val name: String by map
          val age: Int by map
      }
      
      Foydalanish: User(mapOf("name" to "John Doe", "age" to 25))

Kotlin'da delegatsiyaning afzalliklari:

  • Boilerplate kodni kamaytirish: Metod chaqiruvlarini yoki xususiyatlar mantiqini avtomatik ravishda yo'naltirish.
  • Kodning qayta ishlatilishi: Mavjud delegatlarni ishlatish yoki o'z delegatlaringizni yaratish imkoniyati.
  • Mas'uliyatlarni bo'lish: Xususiyat yoki interfeys mantiqini aniq ajratish.
  • Moslashuvchanlik: Delegatsiya xulq-atvorini o'zgartirish imkoniyati, sinfni o'zgartirmasdan.