Sobes.tech
Middle

Czym jest delegacja w Kotlinie?

sobes.tech AI

Odpowiedź od AI

Delegacja w Kotlinie to wzorzec projektowy, w którym obiekt (delegat) przejmuje odpowiedzialność za wykonanie określonego zadania w imieniu innego obiektu. Kotlin obsługuje delegację natywnie na poziomie składni.

Istnieją dwa główne typy delegacji w Kotlinie:

  1. Delegacja klasy (Class Delegation): Pozwala klasie A implementować interfejs, delegując wszystkie wywołania metod tego interfejsu do innego obiektu B.

    interface Base {
        fun printMessage()
    }
    
    class BaseImpl(val x: Int) : Base {
        override fun printMessage() {
            // Implementacja metody interfejsu
            println(x)
        }
    }
    
    class Derived(b: Base) : Base by b // Delegacja do klasy BaseImpl
    

    W przykładzie Derived deleguje implementację Base do obiektu b.

  2. Delegacja właściwości (Delegated Properties): Pozwala delegować logikę pobierania i ustawiania wartości właściwości do innego obiektu. Kotlin udostępnia kilka standardowych delegatów:

    • lazy() dla opóźnionej inicjalizacji.
      val lazyValue: String by lazy {
          // Wykonuje się tylko przy pierwszym odwołaniu do lazyValue
          println("obliczanie!")
          "Cześć"
      }
      
    • Delegates.observable() do powiadamiania słuchaczy o zmianach.
      import kotlin.properties.Delegates
      
      var name: String by Delegates.observable("wartość początkowa") {
          prop, old, new ->
          println("$old -> $new")
      }
      
    • Delegates.vetoable() do przechwytywania zmian przed ich zastosowaniem.
      import kotlin.properties.Delegates
      
      var max: Int by Delegates.vetoable(0) {
          prop, old, new -> new > old
      }
      
    • Delegaty do powiązania z właściwościami map (map).
      class User(val map: Map<String, Any?>) {
          val name: String by map
          val age: Int by map
      }
      
      Użycie: User(mapOf("name" to "John Doe", "age" to 25))

Zalety korzystania z delegacji w Kotlinie:

  • Zmniejszenie ilości powtarzalnego kodu: Automatyczne przekierowywanie wywołań metod lub logiki właściwości.
  • Ponowne użycie kodu: Możliwość korzystania z istniejących delegatów lub tworzenia własnych.
  • Podział odpowiedzialności: Jasne rozdzielenie logiki właściwości lub interfejsu.
  • Elastyczność: Możliwość zmiany zachowania delegacji bez modyfikacji klasy.