Sobes.tech
Middle

Šta je delegiranje u Kotlinu?

sobes.tech АИ

Одговор од АИ

Delegiranje u Kotlinu je obrazac dizajna u kojem objekat (delegat) preuzima odgovornost za izvršenje određenog zadatka u ime drugog objekta. Kotlin podržava delegiranje nativno na nivou sintakse.

Postoje dve glavne vrste delegiranja u Kotlinu:

  1. Delegiranje klase (Class Delegation): Omogućava klasi A da implementira interfejs delegirajući sve pozive metoda tog interfejsa drugom objektu B.

    interface Base {
        fun printMessage()
    }
    
    class BaseImpl(val x: Int) : Base {
        override fun printMessage() {
            // Implementacija metode interfejsa
            println(x)
        }
    }
    
    class Derived(b: Base) : Base by b // Delegiranje klasi BaseImpl
    

    U primeru Derived delegira implementaciju Base objektu b.

  2. Delegiranje svojstava (Delegated Properties): Omogućava delegiranje logike za dobijanje i postavljanje vrednosti svojstva drugom objektu. Kotlin pruža nekoliko standardnih delegata:

    • lazy() za odloženu inicijalizaciju.
      val lazyValue: String by lazy {
          // Izvršava se samo pri prvom pristupu lazyValue
          println("izračunava se!")
          "Zdravo"
      }
      
    • Delegates.observable() za obaveštavanje slušaoca o promenama.
      import kotlin.properties.Delegates
      
      var name: String by Delegates.observable("initial value") {
          prop, old, new ->
          println("$old -> $new")
      }
      
    • Delegates.vetoable() za presretanje promena pre njihove primene.
      import kotlin.properties.Delegates
      
      var max: Int by Delegates.vetoable(0) {
          prop, old, new -> new > old
      }
      
    • Delegati za povezivanje sa svojstvima mape (map).
      class User(val map: Map<String, Any?>) {
          val name: String by map
          val age: Int by map
      }
      
      Upotreba: User(mapOf("name" to "John Doe", "age" to 25))

Prednosti korišćenja delegiranja u Kotlinu:

  • Smanjenje boilerplate koda: Automatsko preusmeravanje poziva metoda ili logike svojstava.
  • Ponovno korišćenje koda: Mogućnost korišćenja gotovih delegata ili pravljenja sopstvenih.
  • Razdvajanje odgovornosti: Jasno razdvajanje logike svojstva ili interfejsa.
  • Fleksibilnost: Mogućnost promene ponašanja delegacije bez promene klase.