Sobes.tech
Middle

Mis on delegeerimine Kotlinis?

sobes.tech AI

Vastus AI-lt

Kotlin'i delegeerimine on disainimuster, kus objekt (delegeerija) võtab enda kanda vastutuse teatud ülesande täitmise eest teise objekti nimel. Kotlin toetab natiivset delegeerimist süntaksitasandil.

On kaks peamist delegeerimise tüüpi Kotlinis:

  1. Klassi delegeerimine (Class Delegation): Annab klassile A võimaluse rakendada liidest, delegeerides selle liidese kõiki meetodite väljakutseid teisele objektile B.

    interface Base {
        fun printMessage()
    }
    
    class BaseImpl(val x: Int) : Base {
        override fun printMessage() {
            // Liidese meetodi rakendus
            println(x)
        }
    }
    
    class Derived(b: Base) : Base by b // Delegeerimine klassile Base
    

    Näites Derived delegeerib Base rakendamise objektile b.

  2. Omaduste delegeerimine (Delegated Properties): Annab võimaluse delegeerida omaduse saamise ja määramise loogika teisele objektile. Kotlin pakub mitmeid standardseid delegeerijaid:

    • lazy() hilinenud initsialiseerimiseks.
      val lazyValue: String by lazy {
          // Täidetakse ainult esimesel korral, kui pöördutakse lazyValue poole
          println("arvutatakse!")
          "Tere"
      }
      
    • Delegates.observable() teavitamiseks muudatustest.
      import kotlin.properties.Delegates
      
      var name: String by Delegates.observable("initial value") {
          prop, old, new ->
          println("$old -> $new")
      }
      
    • Delegates.vetoable() muudatuste peatumiseks enne nende rakendamist.
      import kotlin.properties.Delegates
      
      var max: Int by Delegates.vetoable(0) {
          prop, old, new -> new > old
      }
      
    • Delegeerijad, mis seovad kaardis olevate omadustega (map).
      class User(val map: Map<String, Any?>) {
          val name: String by map
          val age: Int by map
      }
      
      Kasutamine: User(mapOf("name" to "John Doe", "age" to 25))

Kotlin'i delegeerimise eelised:

  • Vähendab boilerplate-koodi: Automaatne meetodite või omaduste loogika suunamine.
  • Koodi taaskasutus: Võimalus kasutada valmis delegeerijaid või luua oma.
  • Vastutuse jaotamine: Selge loogika või liidese jaotamine.
  • Paindlikkus: Võimalus muuta delegeerimise käitumist ilma klassi muutmata.