Sobes.tech
Middle

Čo je delegovanie v Kotlin?

sobes.tech AI

Odpoveď od AI

Delegovanie v Kotlin je návrhový vzor, pri ktorom objekt (delegát) preberá zodpovednosť za vykonanie určitej úlohy v mene iného objektu. Kotlin podporuje delegovanie nativne na úrovni syntaxe.

Existujú dva hlavné typy delegovania v Kotlin:

  1. Delegovanie triedy (Class Delegation): Umožňuje triede A implementovať rozhranie delegovaním všetkých volaní metód tohto rozhrania na iný objekt B.

    interface Base {
        fun printMessage()
    }
    
    class BaseImpl(val x: Int) : Base {
        override fun printMessage() {
            // Implementácia metódy rozhrania
            println(x)
        }
    }
    
    class Derived(b: Base) : Base by b // Delegovanie na triedu BaseImpl
    

    V príklade Derived deleguje implementáciu Base na objekt b.

  2. Delegovanie vlastností (Delegated Properties): Umožňuje delegovať logiku získavania a nastavovania hodnoty vlastnosti na iný objekt. Kotlin poskytuje niekoľko štandardných delegátov:

    • lazy() pre odloženú inicializáciu.
      val lazyValue: String by lazy {
          // Vykoná sa iba pri prvom prístupe k lazyValue
          println("vypočítava sa!")
          "Ahoj"
      }
      
    • Delegates.observable() pre upozornenie poslucháčov na zmeny.
      import kotlin.properties.Delegates
      
      var name: String by Delegates.observable("initial value") {
          prop, old, new ->
          println("$old -> $new")
      }
      
    • Delegates.vetoable() pre zachytávanie zmien pred ich aplikovaním.
      import kotlin.properties.Delegates
      
      var max: Int by Delegates.vetoable(0) {
          prop, old, new -> new > old
      }
      
    • Delegáti na viazanie na vlastnosti mapy (map).
      class User(val map: Map<String, Any?>) {
          val name: String by map
          val age: Int by map
      }
      
      Použitie: User(mapOf("name" to "John Doe", "age" to 25))

Výhody používania delegovania v Kotlin:

  • Zníženie boilerplate kódu: Automatické presmerovanie volaní metód alebo logiky vlastností.
  • Opätovné použitie kódu: Možnosť použiť hotové delegáty alebo vytvoriť vlastné.
  • Rozdelenie zodpovedností: Jasné rozdelenie logiky vlastnosti alebo rozhrania.
  • Flexibilita: Možnosť meniť správanie delegácie bez zmeny triedy.