Sobes.tech
Middle

Kotlinдеги делегация деген эмне?

sobes.tech AI

AIден жооп

Kotlin-дегиелөө — бул дизайн үлгүсү, анда объект (делегат) башка объекттин атынан белгилүү бир тапшырманы аткаруу жоопкерчилигин алат. Kotlin синтаксис деңгээлинде жеке делегирүүнү колдойт.

Kotlinдо эки негизги делегирүү түрү бар:

  1. Класс делегирүү (Class Delegation): A классы интерфейсти ишке ашырат, ал эми бул интерфейсинин бардык метод чакырууларын башка объект Bге делегирет.

    interface Base {
        fun printMessage()
    }
    
    class BaseImpl(val x: Int) : Base {
        override fun printMessage() {
            // Интерфейс методунун ишке ашырылышы
            println(x)
        }
    }
    
    class Derived(b: Base) : Base by b // Base классына делегирүү
    

    Мисалда Derived Base реализациясын b объектисине делегирет.

  2. Мүлктөрдү делегирүү (Delegated Properties): Мүлктүн алуу жана коюу логикасын башка объектке делегиретүүгө мүмкүндүк берет. Kotlin бир нече стандарттык делегаторлорду сунуштайт:

    • lazy() — кечиктирилген инициализация үчүн.
      val lazyValue: String by lazy {
          // Биринчи кайрылууда гана ишке ашат
          println("есептелүүдө!")
          "Салам"
      }
      
    • Delegates.observable() — угучуларга өзгөрүүлөр тууралуу кабарлоо үчүн.
      import kotlin.properties.Delegates
      
      var name: String by Delegates.observable("initial value") {
          prop, old, new ->
          println("$old -> $new")
      }
      
    • Delegates.vetoable() — өзгөрүүлөрдү алдын ала кармоо үчүн.
      import kotlin.properties.Delegates
      
      var max: Int by Delegates.vetoable(0) {
          prop, old, new -> new > old
      }
      
    • Карта мүлктөрү менен байланыштыруу делегаторлору (map).
      class User(val map: Map<String, Any?>) {
          val name: String by map
          val age: Int by map
      }
      
      Колдонуу: User(mapOf("name" to "John Doe", "age" to 25))

Kotlinдо делегирүүнүн артыкчылыктары:

  • Бойлерплейтти азайтуу: Метод чакырууларын же мүлктүн логикасын автоматтык түрдө багыттоо.
  • Кодду кайра колдонуу: Даяр делегаторлорду колдонуу же өздөрүн түзүү мүмкүнчүлүгү.
  • Жоопкерчиликти бөлүү: Мүлктүн же интерфейсдин логикасын так бөлүү.
  • Ийкемдүүлүк: Делегирүүнүн жүрүм-турумун өзгөртүү классты өзгөртпөстөн мүмкүнчүлүк.