Juniors, Praca w IT

Kotlin to kolejny krok dla Java Developera

kotlin developer

Czym jest Kotlin? Ostatnio coraz częściej możemy usłyszeć tą nazwę i to nie dlatego, że jeden z popularnych producentów ketchupu zdobywa międzynarodową sławę. Kotlin to bardzo nowoczesny język programowania stworzony przez firmę JetBrains i jest to język, który warto poznać.

Programiści firmy JetBrains byli zdania, że większość języków nie posiada cech, które potrzebują, z wyjątkiem Scali. Kompilowała ona się jednak zbyt wolno w stosunku do Javy. Postanowili więc stworzyć własny język, który będzie mógł w pełni współpracować z Java i będzie zapewniał podobną wydajność. Tak powstał Kotlin, który został przedstawiony po raz pierwszy w 2011 roku.

Kotlin to statycznie typowany język, który działa na maszynie wirtualnej Javy. Co ważne jest on udostępniony na podstawie licencji Apache 2, w przeciwieństwie do Javy udostępnionej na licencji na GNU GPL. Licencja Apache zapewnia bardzo liberalne podejście na zasadzie „rób co chcesz, tylko mnie nie pozywaj”. W przypadku Javy licencja jest bardziej skomplikowana i w związku z jej wykorzystaniem trwa spór sądowy pomiędzy Oracle (właścicielem praw do Javy), a Google (twórcą Androida, działającego w oparciu o Javę).

Po tym obowiązkowym wstępie wiemy już, że Kotlin powstał, żeby być fajny, nowoczesny i szybki. Skoro jest taki świetny i otwarty to pewnie od razu powinniśmy wszyscy zapomnieć o Javie i przejść na Kotlina? Opowiem wam dziś, jak widzę język Kotlin z perspektywy Android Developera.

Czy zawsze powinniśmy pisać aplikacje w języku Kotlin?

Uncle Bob na pytanie, kiedy pisać testy dla aplikacji odpowiadał – testuj wszystko co się da. Dopiero później, dla bardziej zaawansowanych użytkowników, tłumaczył, że są odstępstwa od ogólnej reguły. Kiedy w takim razie powinniśmy pisać aplikacje w języku Kotlin? Analogiczna odpowiedź brzmiałaby: nigdy.

Zapytacie jak to, przecież jest to świetny i nowoczesny język programowania? Macie rację, ale jest to informacja dla tych bardziej zaawansowanych użytkowników, czujących się już całkiem nieźle w Javie i rozumiejących jak ona działa, więc zróbmy z niej na początek tajemnicę.

Dlaczego Kotlin nie jest dobrym językiem na początek?

Pierwszy powód jest dość oczywisty – Java jest ciągle najpopularniejszym językiem programowania i pojawia się w każdej ofercie pracy. Kotlin jest tylko dodatkowym wymaganiem, który miło byłoby spełnić. Ciągle większość istniejących projektów i bibliotek jest napisana w Javie i minie jeszcze dużo czasu zanim to się zmieni. Na pewno w swojej karierze będziesz musiał pisać kod w Javie albo kod Kotlina, który będzie musiał współpracować z Javą (co wbrew pozorom nie zawsze dzieje się automatycznie).

Również większość istniejącej wiedzy – tutoriale, przykłady, zaawansowane książki zostały przygotowane z myślą o Javie lub użyto w nich przykładów w Javie. Wystarczy też spojrzeć na Stack Overflow by zdać sobie sprawę z różnicy skali. Jest prawie 1,5 mln pytań otagowanych jako Java wobec 10 tys. jako Kotlin.

Znajomość Javy jest potrzebna nie tylko ze względu na „przeszłość”. Kotlin jest językiem, który bardzo wielu rzeczy „domyśla się”, pozbywa się ceremonii obecnej w starszych językach, co pozwala na uzyskanie dużo bardziej zwięzłego kodu. Jest to bardzo fajne narzędzie, ale może być zabójcze dla kogoś, kto nie rozumie jak to działa i skąd to się bierze. Łatwiej będzie zrozumieć to wszystko co dzieje się pod spodem, gdy „wyklepiemy” to wcześniej w naszej starej dobrej Javie.

Być może głównym argumentem jest to, że Kotlin kompiluje się do kodu bajtowego Javy. Technicznie kod maszynowy będzie działał na tych samych zasadach co wcześniej. Trzeba to rozumieć, zwłaszcza mając na uwadze kwestie wydajności. W bardziej zaawansowanych zastosowaniach będzie nawet konieczne sprawdzenie jaki będzie efekt wynikowy tych kompilacji.

Ostatnim powodem, dlaczego warto zacząć od Javy jest to, że łatwo automatycznie przekonwertować Javę w Kotlina, natomiast w drugą stronę jest to trudniejsze.

Już umiem Javę, to po co mi w takim razie ten cały Kotlin?

Najprostsza odpowiedź brzmi – bo możesz. Programiści to osoby lubiące nowe rzeczy, a w przypadku Kotlina przejście jest wyjątkowo łatwe. Język został stworzony właśnie z myślą o przejściu programistów z Javy. W najpopularniejszym IDE – IntelliJ wystarczy nacisnąć kombinację czterech przycisków i już z klasy Javowej mamy Kotlina. Oczywiście nie jest to idealna wersja tego co chcielibyśmy uzyskać, bez wykorzystania wielu funkcjonalności języka i czasem niebezpieczna, ale coś na dobry początek.

Dzięki temu też od razu widzisz podstawowe różnice między językami i co się zmieniło, a przede wszystkim co zniknęło. Od tego punktu też polecam zacząć naukę, a z biegiem czasu zobaczysz jak dużo jeszcze jesteś w stanie osiągnąć.

Kotlin posiada też świetne tutoriale na swojej stronie, a także Try Kotlin, gdzie online możesz pobawić się nowymi funkcjonalnościami. Sam byłem w niemałym szoku jak naturalnie wychodzi mi przejście na nowy język. Samo pisanie w Kotlinie przywróciło mi radość z pisania kodu, zamiast „klepania” kodu w Javie.

Dzięki tej całej bezceremonialności Kotlina i skróceniu klas możemy skupić się na tym co naprawdę jest ważne w naszej aplikacji, zamiast rzemieślniczo przepisywać setki takich samych linijek. Kolejnym fajnym aspektem jest to, że większość dobrych praktyk ciągle jest taka sama! Wszystko co znacie z książek „Effective Java” czy „Clean Code” dalej ma tutaj rację bytu.

Ciągle nie jesteś przekonany? To posłuchaj innych i daj sobie szansę. Kotlin stał się modny, „trendy”, fajny. Jest już z nami od jakiegoś czasu i stał się naprawdę dojrzałym produktem, którego API nie będzie się dynamicznie zmieniać. Dużo osób, które osobiście uznaję za autorytety przeszło na Kotlina, więc musisz wiedzieć, że dużo najfajniejszych rzeczy będzie się teraz dziać w tym języku. Google uznało Kotlina za oficjalny język Androida i nawet sam Jake Wharton postanowił przejść do Google, by móc wspierać ten język.

Pamiętaj też, kto stoi za tym językiem. Stworzyli go ludzie z JetBrains od IntelliJ – Twojego ulubionego IDE. Żaden inny język nigdy nie będzie miał takiej integracji z IDE jak ten.

„Miałeś moją ciekawość. Teraz masz moją uwagę”

Już wiemy, że Kotlin jest gdzieś tam pod spodem kodem bajtowym Javy, więc jakiej Javy wymaga? Działa od wersji 6 i daje nam wszystkie swoje funkcjonalności już od samego początku. Nie musisz użerać się ze starą wersją Javy i płakać z tęsknoty za nowościami.

Wspominałem wcześniej, że kod jest dużo bardziej zwięzły, co ułatwia skupienie się na ważnych rzeczach, ale to ma też dodatkową ukrytą zaletę. Przeglądanie takiego kodu jest dużo przyjemniejsze i pracując w zespole będziecie mogli szybciej zrozumieć istniejący kod, znaleźć ewentualne błędy i usprawnienia.

Teraz samo „mięso fajności”, a w nim kilka technicznych szczegółów:

1. Mamy lambdy – po prostu, bez żadnych wyjątków, bez retrolambdy, bez Javy 8. Zmniejsza niepotrzebny kod. Bardzo.

Java

button.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
    doMagic(view);
  }
});

Kotlin

button.setOnClickListener { view ->
  doMagic(view)
}

2. Mamy „optionale” – Tony Hoare nazwał stworzenie null referencji swoim billion-dollar mistake. Teraz dzięki prostemu znakowi „?” tworzymy obiekt typu Nullable, który pozwala w przyjemny sposób obejść się z wartością null. W związku z tym mamy też trzy nowe operatory:

  • „?.” – operator bezpiecznego wywołania,
  • „!!” – asercja sprawdzająca czy obiekt jest null’em i rzucające NullPointerException,
  • „?:” – Elvis, który pozwoli nam zdecydować co zrobić, gdy obiekt jest null’em,

Java

public String checkNull(Object data) {
  if (data != null) {
    return data.toString();
  }else {
    return "";
  }
}

Kotlin

fun checkNull1(data: Any?): String {
  return data?.toString() ?: "" //Odpowiednik wersji z Javy
}
fun checkNull2(data: Any?) {
  data?.toString() // Nigdy się nie wykona jeżeli data jest nullem
  data!!.toString() // rzuci NPE gdy data jest nullem
}
fun checkNull3(data: Any?) = data?.toString() ?: "" //Da się jeszcze krócej

3. Mamy Kotlinx – na pewno każdy z Was kojarzy bibliotekę Butter Knife na Android’a albo nieśmiertelne findViewById. Teraz mamy bezpośredni dostęp do widoków przez ID – to po prostu działa.

Java

FloatingActionButton button = (FloatingActionButton) findViewById(R.id.button);

Kotlin

import kotlinx.android.synthetic.main.activity_main.*
button //Mamy już dos†ęp do obiektu

4. Pamiętacie stare klasy POJO z ogromną ilością setterów i getterów, a także koniecznością pisania metod equals(), hashCode(), toString(), copy()? Tutaj mamy to wszystko dostępne od ręki jako data class.

Java

public class DataJava {
  private String id;
  DataJava(String id) {
    this.id = id;
  }
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    DataJava data = (DataJava) o;
    return Objects.equals(id, data.id);
  }
  @Override
  public int hashCode() {
    return Objects.hash(id);
  }
  @Override
  public String toString() {
    return "DataJava{" + "id='" + id + ''' + '}';
  }

Kotlin

data class DataKotlin(
  var id: String?
)

5. Czuliście, że brakuje wam czegoś w enumach? Proszę bardzo oto Sealed Classes – enumy na sterydach, które pozwalają mieć kilka instancji danego typu i pozwalają przechowywać ich stan

Java

public class ResourcesJava{
  public enum DataState { LOADING, SUCCESS, ERROR }
  DataState state;
  Object data;
  Throwable error;
  ResourcesJava(DataState state, Object data, Throwable error){
    this.state = state;
    this.data = data;
    this.error = error;
  }
}

Kotlin

sealed class ResourcesKotlin
object Loading : ResourcesKotlin()
data class Data(val data : Any) : ResourcesKotlin()
data class Error(val error : Throwable) : ResourcesKotlin()

6. Mamy extension function – jeżeli kiedykolwiek w jakimś API brakowało Ci metody teraz masz możliwość ją samemu stworzyć. Najprostszy przykład to dodanie metod hide() i show() do View, ale możliwości są nieograniczone.

fun View.hide(){
  this.visibility = View.GONE
}
fun hideView(view : View){
  view.hide()
}

7. Kotlin daje bardzo dużo zdefiniowanych wcześniej extension function, np. wzorzec budowniczego, czy możliwość operacji na kolekcjach jak na strumieniach.

fun buildBundle() : Bundle{
  return Bundle().apply {
    putString("Key1", "Value1")
    putString("Key2", "Value2")
  }
}
fun getString(strings: List<String>): String {
  return strings
    .filter { it.length > 10 }
    .map { it.substring(0,5)}
    .first{ it.contains("szukany")}
}

To teraz jak żyć?

Opowiem wam teraz jak my pracujemy z Kotlinem. Wszystkie nowe projekty piszemy w Kotlinie. Zawsze. Mamy jednak też dużo starszych projektów napisanych w Javie. Jak wtedy działamy? Wszystkie nowe klasy piszemy w Kotlinie. Trochę bardziej skomplikowana sytuacja jest wtedy, gdy musimy pracować z już istniejącą klasą w Javie. To już zależy od ilości zmian, które chcemy wprowadzić.

Jeżeli są to drobne zmiany to zostajemy przy Javie – niestety konwersja na Kotlina powoduje utratę historii zmian w pliku. Jeżeli natomiast jest to „coś większego” to zazwyczaj zaczynamy od magicznej komendy konwertującej Javę do Kotlina. Dzięki temu praca od razu staje się przyjemniejsza.

Jeżeli boicie się konwertować produkcyjny kod na Kotlina, świetnym pomysłem na początek jest przepisanie kodu testów. Zakładam oczywiście, że piszecie testy, a jeżeli jeszcze nie to właśnie podjęliście decyzję, by zacząć pisać je w Kotlinie.

Co z back-end’em zapytacie? Jeżeli macie go napisanego w Javie – pokochacie jego nową wersję w Kotlinie. W końcu Kotlin to taka super Java. Tutaj jednak trzeba bardziej uważać. Z rozmów z moimi kolegami wiem, że przejście nie jest tak naturalne jak w świecie Androida. Trzeba bardziej uważać w przypadku integracji ze Spring’iem i Hibernate’m. Kotlin jeszcze się tam tak bardzo nie zadomowił, ale moim zdaniem to tylko kwestia czasu. Póki co najbardziej krytyczne części systemu ciągle są utrzymywane i pisane w Javie, cała reszta czerpie pełnymi garściami z nowych możliwości.

Macie coś jeszcze?

Zdecydowanie tak! Wspomnę tutaj tylko o kilku rzeczach, o każdej z nich można byłoby napisać osobny artykuł – zachęcam Was do doczytania na ten temat.

  • Kotlin wspiera także modne ostatnio programowanie funkcyjne. Moim zdaniem jest to bardzo dobry trend rozwoju. Mamy na przykład funkcje pierwszej klasy (może być przechowywana jako obiekt) i funkcje wyższego rzędu (zwracają lub przyjmują inne funkcje). Powstała też specjalna biblioteka do wspierania programowania funkcyjnego „Arrow”.
  • RxJava była uważana za największe wydarzenie w świecie Android i owszem jest super, ale czy może być coś lepszego? Tak! Mamy coroutines! Upraszcza asynchroniczne programowanie, przez dostarczenie mechanizmów pisania kodu sekwencyjnego. W realnym świecie w większości nie operujemy na prawdziwych strumieniach tylko na kolekcjach. Jak wiemy Kotlin pozwala operować na kolekcjach jak na strumieniach. We wstępnych testach Coroutines prezentują się dużo bardziej wydajne (zwłaszcza pamięciowo) w przypadku operacji na kolekcjach. W przypadku pracy z realnymi strumieniami pewnie ciągle RxJava będzie lepsza.
  • Zawsze chciałeś pisać jeden kod na kilka platform? Zaprzyjaźnij się z Kotlin/Native. Niestety jeszcze daleko do pełnej funkcjonalności tego narzędzia, ale już powstają aplikacje napisane dla Androida, iOSa, a nawet aplikacje webowe.
  • Kotlin jest kodem składniowo bardzo podobnym do Swifta znanego z iOSa. Dzięki temu zespoły mogą sobie robić wzajemny Code Review! Znacząco zwiększa to wymianę wiedzy i zacieśnia współpracę.

Podsumowanie

Zastanawiałem się też czy są jeszcze jakieś argumenty, dla których ktoś nie chciałby używać Kotlina. Naprawdę nie umiałem ich znaleźć. Owszem nieumiejętne jego wykorzystanie może mieć narzut na wydajność, ale to też kwestia praktyki. Być może gdybym chciał napisać ultra lekkie SDK wtedy, rzeczywiście zastanowiłbym się, czy zostać przy Javie.

Gdyby jednak ktoś mi teraz kazał całkowicie przestać go używać, powołałbym się na klauzulę sumienia. Dla mnie Kotlin to najlepsze „narzędzie programistyczne” z jakim spotkałem się w ostatnich latach. Zdecydowanie przywraca radość z pisania kodu i aż chce się go używać.

Wspomniałem tutaj o wielu fajnych cechach języka, ale uwierzcie mi, że to dopiero drobny wstęp i jest jeszcze bardzo dużo do odkrycia. Zachęcam Was do rozpoczęcia swojej przygody jeżeli już znacie Javę. Ja ciągle uczę się czegoś nowego i za każdym razem czuję się jak dziecko w sklepie z cukierkami.

baner

Zdjęcie główne artykułu pochodzi z unsplash.com.

Android Developer z zamiłowaniem do biznesu i zarządzania

Chce tworzyć wspaniałe produkty w szeroko pojętym obszarze mobile. Telefony komórkowe to obecnie zdalne piloty naszego życia, róbmy je dobrze! Zawsze na pierwszym miejscu stawia użytkownika – zarówno ostatecznego użytkownika aplikacji, jak i tego, który w przyszłości będzie przeglądał kod. Fanatyk czystej architektury, wyznawca SOLID, fanboy Kotlin’a.

Podobne artykuły

[wpdevart_facebook_comment curent_url="https://geek.justjoin.it/kotlin-java-developer/" order_type="social" width="100%" count_of_comments="8" ]