Cześć, dziś chciałbym zaprezentować język Kotlin w którym możemy pisać aplikacje Android.
Język Kotlin jest stosunkowo młody. Porównując do javy, jest to nowy język. Teoretycznie nie powinniśmy przyrównywać Kotlina do Java, ponieważ jest on językiem funkcyjnym statycznie typowanym, ale mając dwie możliwości pisania aplikacji możemy pokusić się porównanie kodu aplikacji pisanej w Kotlinie do kodu aplikacji pisanej w Java.
Na wstępie chciałbym zaznaczyć, że kod umieszczony na repozytorium jest kodem tylko poglądowym i nie należy go poddawać restrykcyjnemu code review 😛
Można kod javy uprościć stosując zewnętrzne biblioteki takie jest jak guava czy retrolambda, ale nie o to w tym chodzi. Pisałem bez dodatkowych zależności w javie.Kotlin też jest taki, jaki dostarczają nam twórcy języka.
Tutorial nie jest po to aby poznać podstawy języka tylko żeby zobaczyć różnice w pisaniu. Często inny język (a tym bardziej funkcyjny) pokazuje inne światło na programowanie. Jeśli ktoś chciałby zacząć uczyć się języka zapraszam na stronę: Kotlin gdzie możemy go wypróbować online, przejść kurs czy zerknąć w dokumentację.
Kod w repozytorium nie jest idealny. Kilka rzeczy można uprościć, kilka rzeczy nie powinno się robić jednak idea tego wpisu jest inna. Ma na celu pokazać różnice pomiędzy java, a kotlin oraz pokazać możliwości tego drugiego. Jeśli ktoś jest zainteresowany, aby głębiej poznać język to jetbrains udostępnia źródła: JetBrains
Dodatkowo założyłem, że naszym backed'em będzie klasa która zwróci listę 100 user'ów, a potem będziemy czarować. Na potrzeby wpisu wystarczające.
Tyle tytułem wstępu, zaczynajmy.
1. Android Studio
2. Java w wersji 7
3. Minimum SKD 19 (takiego użyłem, ale można niżej)
4. Kotlin
5. Kotlin Android Extensions
Aby skonfigurować Kotlina w Android Studio trzeba przejść przez: Jak skonfigurować kotlin w Android Studio
1. Modelowanie klas.
Temat podstawowy. Każdy kto pisał większą apkę spotkał się z modelami. Czy to klasa modelowana na podstawie JSON'a czy to klasa która trzymać nam będzie jakieś obiekty, stany. Doskonale wiemy jak powinno się taką klasę w javie napisać. Konstruktor, gettery, settery, equals'y i hashcode (zakładamy, że nasza klasa będzie parcelable).
Spójrzmy zatem jak to wygląda w Java:
https://github.com/gitcoderoid/kotlinforandroid/blob/develop/app/src/main/java/com/example/tutorial1/backend/UserJava.java
Kodu co prawda nie musimy pisać ręcznie, ponieważ Android Studio udostępnia nam generatory tego wszystkiego, ale 86 linijek robi wrażenie.
Spójrzmy na to jak to wygląda w Kotlinie:
https://github.com/gitcoderoid/kotlinforandroid/blob/develop/app/src/main/kotlin/com/example/tutorial1/backend/UserKotlin.kt
Wiele mówić nie trzeba. Data class w Kotlinie zawiera już:
konstruktor
set()/get()
equals()/hashCode()
toString()
copy()
Sporo pracy odpada, robi to za nas język.
Jedyna rzecz, która tutaj nie powinna mieć miejsca to:
val moreAction: () -> Unit
Ten obiekt posłuży nam do przetrzymywania akcji onClick. Jeśli chcemy parcelować UserKotlin, powinniśmy mieć tylko i wyłącznie obiekty informujące o stanie.
2. Pętle i extension method.
Zobaczmy w jaki sposób generujemy 100 userów w klasie java:
https://github.com/gitcoderoid/kotlinforandroid/blob/develop/app/src/main/java/com/example/tutorial1/backend/JavaService.java
A teraz kotlin:
https://github.com/gitcoderoid/kotlinforandroid/blob/develop/app/src/main/kotlin/com/example/tutorial1/backend/KotlinService.kt
`map` w kotlinie zwróci nam listę obiektów, którą wygenerowaliśmy za pomocą iteratora `it`. `it` to nic innego jak `i` z `for'a`. Znak `=` za nazwą metody oznacza że będziemy robić od razu `return`.
`For` zastępujemy (1..100) 🙂
Zobaczmy na funkcję Int.getRandom(). Wiemy już dlaczego mamy znak `=`. Wykorzystujemy tą metodę w tworzeniu obiektu typu UserKotlin. Przypuśćmy, że jesteśmy na 4 elemencie. A zatem:
4.getRandom() = Random().nextInt(4) + 10
3. Operacje na listach.
W projekcie zaprezentowałem filtrowanie i sortowanie. Często przydatne i często wykorzystywane opcje. Popatrzmy na jave:
https://github.com/gitcoderoid/kotlinforandroid/blob/develop/app/src/main/java/com/example/tutorial1/MainActivityPresenter.java
i na kotlina:
https://github.com/gitcoderoid/kotlinforandroid/blob/develop/app/src/main/kotlin/com/example/tutorial1/MainActivityKotlinPresenter.kt
"To coś" od linii 58 w javie służy nam za filtrowanie po ilości głosów. Jasne, że java 8 ma stream, lambdy. W Androidzie nie mamy tego niestety 🙁
W kotlinie załatwiamy to przez extension method, która w parametrze przyjmuje predykat. Tutaj jest nieco przerost formy nad treścią, ponieważ śmiało możemy wykorzystać metodę `filter` przy kolekcji, przy tym nie tworząc `filterBy`, ale tworzenie własnych predykatów było zbyt ciekawe, aby je pominąć 🙂
Aby zrobić sortowanie w java piszemy własny comparator. W kotlinie jest to metoda na kolekcji `sortedBy`
4. Switch case
Standardowo w java:
https://github.com/gitcoderoid/kotlinforandroid/blob/develop/app/src/main/java/com/example/tutorial1/MainActivity.java#L61
i kotlin:
https://github.com/gitcoderoid/kotlinforandroid/blob/develop/app/src/main/kotlin/com/example/tutorial1/MainActivityKotlin.kt#L45
W sumie nie wiele się różni, oprócz tego, że możemy to załatwić metodą inline ponieważ when zwraca typ który zostanie wybrany.
5. Widoki.
Zaprezentuję na przykładzie adaptera (recycler view i view holder). Adaptery piszemy wszyscy. Wszyscy wiemy jak uciążliwe jest pisanie
Button more = (Button) view.findViewById(R.id.more_button);
Spójrzmy na jave:
https://github.com/gitcoderoid/kotlinforandroid/blob/develop/app/src/main/java/com/example/tutorial1/JavaRecyclerView.java
a teraz na kotlina:
https://github.com/gitcoderoid/kotlinforandroid/blob/develop/app/src/main/kotlin/com/example/tutorial1/KotlinRecyclerView.kt
Synthetic to jest to co tygryski lubią najbardziej. ButterKnife, pisząc kolokwialnie do pięt nie dorasta 😛 W MainActivity również możemy zobaczyć, jak działa synthetic i nie pisać tego wszystkiego 🙂
Wpis ma na celu pokazanie jak można wykorzystać Kotlina w pisaniu aplikacji Android, a nie "poniżanie" javy. Można te dwie rzeczy połączyć i podzielić projekt na części, które lepiej napisać w java i na te które lepiej napisać w kotlinie. Co prawda przedstawiłem javę w marnym świetle, ale może dzięki temu ktoś będzie chciał nauczyć się nowego języka, a to zawsze warto!
Żeby jednak nie było tak różowo i cukierkowo o tym kotlinie. Build z kotlinem potrafi trwać dwukrotnie dłużej niż build, który nie ma kotlina... ale coś za coś
Zapraszam do dyskusji, zadawania pytań!
Github
P.S Zwróćcie uwagę na to jak można robić konstruktory w kotlinie.