Delegated Properties (Delegacja)

Kliknij i wspomóż mnie :)

Kotlin

W Kotlinie wzorzec delegacji (Delegation pattern) jest domyślnie zaimplementowany do biblioteki. W tym poście postaram się omówić podstawy oraz pokazać przykłady.

Założenia delegacji w Kotlinie

Nie zawsze jest tak, że wiemy jakie dane przyjmą nasze zmienne albo chcemy pozbyć się z danej partii kodu inicjowania tych danych.

Takie podejście ma dwa kluczowe założenia:

•Po pierwsze - Odpuszczamy inicjowanie pustych zmiennych.

•Po drugie - Ułatwiamy zmiany w implementacji.

Podział delegacji w Kotlinie

Dokumentacja Kotlina nie zakłada tylko jednego rodzaju Delegated Properties. W tabeli poniżej przedstawiam wszystkie rodzaje:

  • Lazy - zmienna przetwarzana jest tylko raz, póżniej już jest tylko zwracana.
  • Delegated Properties - używają getValue() i setValue() do nasłuchiwania zmian.
  • Observable - przy zainicjowaniu nowej zmiennej zwraca wartości: nowa, stara, obiekt do którego przypisano.
  • Map<> - wykorzystywany podczas dynamicznego inicjowania zmiennych. Na przykład odczyt: plików JSON, baz danych.
  • Local Delegated Properties - poprzez lambdę przenoszą odpowiedzialność za inicjowanie zmiennej lokalnej na wywołanie funkcji.

Szczególny przypadek lateinit

Na oficjalnej stronie Kotlina nie ma wzmianki o słowie kluczowym lateinit. Myślę jednak, że śmiało można zaliczyć go do delegacji.

Delegated Properties

Słowo kluczowe lateinit pozwala na zadeklarowanie zmiennej później niż w konstruktorze. Szczególnie przydatne okazuje się to podczas używania dependency injection oraz w testach jednostkowych.

Od wersji Kotlin'a 1.2 można sprawdzać poprzez operator referencji (::) czy zmienna lateinit jest zainicjowana.

W powyższym przykładzie bez względu czy uruchomimy funkcję initialize() czy nie, to kompilator nie rzuci nam błędu.

Zastosowanie Delegated Properties

Jako, iż znamy już możliwe wersje oddelegowywania inicjacji obiektów w Kotlin'ie. Warto zobaczyć jak można wykorzystać to w praktyce.

Klasa GetTopics jest delegatem ponieważ odsuwa przypisanie wartości zmiennej topics do metody getValue().

Dopóki nasz zmienna jest immutable (val) to nie musimy implementować interfejsu setValue().

Jeżeli zdziwiło Cię dziwne użycie konstruktora Array() to możesz o tym poczytać więcej tutaj:

Kotlin - Array

Dziękuję Ci za przeczytanie tego materiału 😀 Jeżeli spodobało Ci się to o czym piszę, możesz sprawdzić więcej materiałów na blogu lub udostępnić znajomym. Będzie mi bardzo miło 😊

O mnie

Jestem młodym programistą, który dumnie dzierży wiele pasji takich jak bieganie czy piwowarstwo domowe. Jedną z nich jest także programowanie i o tym właśnie zamierzam tutaj pisać.

Zobacz więcej

Najnowsze posty

Kliknij i wspomóż mnie :)

Zostańmy w kontakcie

* Wymagane
Kliknij i wspomóż mnie :)
shop
Otwórz Sklep Play

Zachęcam Cię do odwiedzenia mojej strony na Google Play store i sprawdzenia wszystkich moich aplikacji.