Klasy

Kliknij i wspomóż mnie :)

Kotlin

Kotlin umożliwia nam pracę z różnymi rodzajami klas. W tym poście zamierzam krótko omówić każdą z nich wraz z modyfikatorami widoczności (Visibility Modifiers).

Visibility Modifiers

Język dla klas oraz innych obiektów takich jak: funkcje, konstruktory czy interfejsy dopuszcza cztery modyfikatory. Poniżej przedstawiam tabelkę z wytłumaczeniem.

  • public - (domyślny) widoczni są publiczni członkowie dla innych klas
  • private - dostęp do członków tylko wewnątrz klasy
  • protected - tak samo jak private ale również widoczne dla podklas
  • internal - widoczne dla klientów danego modułu

Zanim pokażę przykład, który nieco może rozjaśnić użycie tych modyfikatorów, trzeba powiedzieć o jeszcze jednej rzeczy.

Aby móc dziedziczyć po danej klasie, musi ona zostać oznaczona jako open lub abstract.

Domyślnie w Kotlin'ie klasy są finalne, a wywodzi się to z:

Effective Java Item 17

Słowo open jest całkowitym przeciwieństwem Javowego final.

Warto o tym pamiętać, gdyż wiele framework'ów wymaga by klasy były non-final, przez co napotykamy na błędy choćby takie jak:

Fantastyczne rozwiązanie tego problemu podaje Antonio Leiva w swoim artykule.

How to mock final classes on Kotlin using Mockito 2

Wykorzystanie Visibility Modifiers

Adnotacja open pozwala także nadpisywać funkcje oraz wartości klas nadrzędnych.

W przykładzie użycie funkcji private oraz protected ogranicza się do jednej klasy. Z kolei public i internal pozwalają je wywołać w klasie dziedziczącej.

Enum Classes

Klasy Enum nie różnią się wiele od tych z Javy. W skrócie pozwalają one na zdefiniowanie zbioru możliwych wartości.

Dzięki takiemu zabiegowi wiemy, że funkcja printDirection() zawsze dostanie parametr typu Direction.

Dla klas enum możemy zdefiniować konstruktor i reprezentować je choćby tak:

Sealed Classes

Sealed classes są rozszerzeniem klas enum. Reprezentują one hierarchiczną reprezentację danego typu z ograniczonego zbioru.

Kolejny raz Antonio Leiva w obrazowy sposób ukazuje ideę sealed classes.

Sealed classes in Kotlin

Obiektami klasy Operation mogą być class lub data class dziedziczące po niej.

Lepszy kod cz.1 (Data class)

W Kotlin'ie najczęściej wykorzystuje się je w połączeniu z when.

W tym przypadku jako drugi parametry możemy przekazać obiekt typu Operation, a co za tym idzie skończony zbiór możliwych operacji.

Jeżeli wypełnimy wszystkie przypadki dla Operation to nie wymagane będzie przez kompilator użycie else.

Na sam koniec nadmienię tylko, że sealed classes są zawsze abstrakcyjne oraz mają zawsze prywatny konstruktor.

Inline Classes

Inline Classes zostały wprowadzone od wersji 1.3 i obecnie są oznaczone jako experimental.

Nie przeszkadza to jednak, żeby nieco o nich opowiedzieć.

Nazwa nawiązuje do Inline Functions, które to rozwiązują problem memory overhead dla funkcji wyższego rzędu.

Inline Functions

Cała idea polega na tym, żeby obudować jakiś typ np. String zrozumiałym dla nas obiektem.

Problem pojawia się wtedy, gdy chcemy obudować typy prymitywne. Kompilator pod względem wydajności traktuje je inaczej.

Używając zwykłej klasy, tracimy skok wydajnościowy związany z prymitywami.

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.