Sobes.tech
Middle

Kas yra delegavimas Kotlin'e?

sobes.tech AI

Atsakymas iš AI

Kotlin delegavimas — tai projektavimo šablonas, kuriame objektas (delegatas) perima atsakomybę už tam tikro užduoties vykdymą kito objekto vardu. Kotlin palaiko nativų delegavimą sintaksės lygyje.

Yra du pagrindiniai delegavimo tipai Kotlin:

  1. Klasės delegavimas (Class Delegation): Leidžia klasei A įgyvendinti sąsają, deleguojant visus šios sąsajos metodų iškvietimus kitam objektui B.

    interface Base {
        fun printMessage()
    }
    
    class BaseImpl(val x: Int) : Base {
        override fun printMessage() {
            // Sąsajos metodo įgyvendinimas
            println(x)
        }
    }
    
    class Derived(b: Base) : Base by b // Delegavimas klasei Base
    

    Pavyzdyje Derived deleguoja Base įgyvendinimą objektui b.

  2. Savybių delegavimas (Delegated Properties): Leidžia deleguoti logiką, susijusią su savybės gavimu ir nustatymu, kitam objektui. Kotlin siūlo keletą standartinių delegatų:

    • lazy() vėlyvai inicializacijai.
      val lazyValue: String by lazy {
          // Vykdoma tik pirmą kartą, kai kreipiamasi į lazyValue
          println("skaičiuojama!")
          "Labas"
      }
      
    • Delegates.observable() įspėjimui apie pokyčius.
      import kotlin.properties.Delegates
      
      var name: String by Delegates.observable("initial value") {
          prop, old, new ->
          println("$old -> $new")
      }
      
    • Delegates.vetoable() pakeitimų sulaikymui prieš jų taikymą.
      import kotlin.properties.Delegates
      
      var max: Int by Delegates.vetoable(0) {
          prop, old, new -> new > old
      }
      
    • Delegatai, susiejantys su žemėlapio (map) savybėmis.
      class User(val map: Map<String, Any?>) {
          val name: String by map
          val age: Int by map
      }
      
      Naudojimas: User(mapOf("name" to "John Doe", "age" to 25))

Kotlin delegavimo privalumai:

  • Mažesnis boilerplate kodas: Automatinis metodų ar savybių logikos nukreipimas.
  • Kodo pakartotinis naudojimas: Galimybė naudoti paruoštus delegatus arba kurti savo.
  • Atsakomybės pasidalijimas: Aiškus logikos ar sąsajos atskyrimas.
  • Lankstumas: Galimybė keisti delegavimo elgesį be klasės keitimo.