Funkcionalnosti koje izdvajaju Kotlin u odnosu na druge programske jezike

Zašto je novi zvanični jezik za razvoj Android aplikacija izazvao toliko oduševljenje u zajednici i koje ga to funkcionalnosti izdvajaju u odnosu na druge programske jezike.

Marko Arsić - 3. Jul, 2017.

Nedavno smo se upoznali sa novim zvaničnim jezikom za razvoj Android aplikacija. Na tu temu je bilo više reči i na meetupu Kotlin Srbija korisničke grupe održanom u Startit Centru Beograd.

Kako bismo vam na što bolji način približili Kotlin, u ovom tekstu ćemo opisati zašto je ovaj jezik izazvao toliko oduševljenje u Android zajednici i koje su to funkcionalnosti koje ga svrstavaju u grupu savremenih programskih jezika.

Imajte na umu da izdvajamo samo neke od funkcionalnosti po kojima se Kotlin ističe u odnosu na druge jezike. Podsećam da kompletan pregled ovog jezika i sintakse možete pogledati na zvaničnom Kotlin sajtu kao i u dokumentaciji jezika.

“Nullable”

Kotlin “type” sistem razlikuje nullable i ne nullable tipove. Nullable tipove definišemo navođenjem znaka “?” nakon definisanja tipa (primer String?). Ovako definisana promenljiva kompajleru daje do znanja da ona u nekom trenutku izvršavanja aplikacije može da ima vrednost “null” i da je pre korišćenja ove promenljive neophodno izvršiti proveru da li je inicijalizovana. Kao što vidite na primeru ispod, kompajler se buni kada želimo da uradimo operaciju na promenljivoj mightBeNull, ako nismo uradili prethodnu null proveru. Na ovaj način nam sam “type” sistem pomaže u izbegavanju NullPointerException izuzetka u toku izvršavanja aplikacije (eng. runtime).

image0

Imenovani parametri i podrazumevane vrednosti

Svi smo se u kodu sretali sa metodama koje imaju previše ulaznih parametara da bismo ih pratili jednostavno i one često izgledaju na primer ovako:

image1

Prilikom poziva ovako definisanih metoda moramo da navedemo svaki ulazni parametar u tačnom redosledu kao i da prosledimo vrednost za njega iako ćemo za većinu njih navoditi njihove već podrazumevane (eng. default) vrednosti.

U Kotlinu istu stvar mozemo da postignemo mnogo elegantnije korišćenjem koncepta imenovanih argumenata i podrazumevanih vrednosti koje su već integrisane u jezik:

image2

Pored toga što nam pomaže da izbegnemo greške koje su dosta čest slučaj pri korišćenju ovako definisanih metoda, ovo je mnogo jednostavnije i preglednije za čitanje. Takođe, velika prednost ove funkcionalnosti koju poseduje Kotlin je i to što smanjuje broj implementacija neke funkcije koju treba da napišete (eng. overloaded functions)

“when” naredba

Kotlin uvodi naredbu when koja daje više mogućnosti od sada već tradicionalne switch naredbe u drugim programskim jezicima. When sekvencialno poredi prosleđene argumente kroz sve grane sve dok uslov iz neke od grana ne bude zadovoljen. When se može koristiti kao naredba ili izraz. Ako se koristi kao izraz vrednost zadovoljene grane postaje vrednost celog izraza. Ako se koristi kao naredba vrednost grane koja zadovoljava uslov je ignorisana.

image3

U else granu when naredbe se ulazi ako ni jedna od grana ne zadovoljava uslove. U slučaju da se when koristi kao izraz else grana je obavezna osim ako kompajler ne prepozna da su svi mogući slučajevi već pokriveni u granama.

When se može koristiti i kao zamena za if-else if lanac. Ako when nema argumenata za proveru onda su uslovi grana jednostavni boolean izrazi, odnosno grana je izvršena ako je uslov ispunjen.

image4

Pametna konverzija tipova (Smart Casts)

Da li ste se nekad zapitali zašto je potrebno da kastujete objekat u neku klasu iako ste već proverili da li je taj objekat instanca te klase? U Kotlinu to ne morate da radite u većini slučajeva, jer kompajler prati upotrebu ključne reči is za nepromenjljive (eng. immutable) vrednosti i automatski kastuje po potrebi. Na promeru ispod možemo uočiti da je promenljiva x u telu if naredbe tipa String, odnosno Kotlin kompajler je za nas odradio pametnu konverziju tipova. Van bloka if naredbe promenljiva x je i dalje tipa Object.

image5

Ovo pravilo važi i kada koristimo when naredbu:

image6

Treba napomenuti da pametno kastovanje ne radi u slučajevima kada kompajler ne može da garantuje da promenljiva ne može da se promeni između provere, a to se najčešće odnosi na slučaj ako se promenljiva nalazi u nekom lambda izrazu.

“Extension functions”

Kotlin vam omogućava da dodate nove metode na već postojeće tipove. Ova funkcionalnost znači da ne morate više da kreirate pomoćne klase koje reimplementiraju već postojeće ili da koristite neki od dizajn paterna kao što je dekorator. Ovo je u Kotlin ugrađeno posebnim deklaracijama koje se nazivaju ekstenzije. Jednostavnim definisanjem nove metode na postojećoj klasi, ta metoda postaje dostupna na svim već postojećim instancama klase.

image7

Kotlin podržava ekstenzije na funkcijama kao i na propertijima:

image8

Lambde

Lambda izraz se u Kotlinu sastoji od vitičastih zagrada, deklaracije parametara koji u punoj formi idu unutar zagrada sa opcionim tipovima i tela izraza koje ide nakon -> znaka.

image9

Kotlin ima konciznu sintaksu za lambde koja omogućava laku primenu i korišćenje paradigmi i koncepata funkcinonalnog programiranja u ovom jeziku. Lambde možemo koristiti u skoro svakom aspektu jezika. Na primer u jednoj liniji možemo preveriti da li je svaki element kolekcije String:

image10

Uobičajno je da lambda izraz ima samo jedan parametar. Ako Kotlin sam može da zaključi to iz potpisa metode dozvoljava nam da taj parametar izostavimo prilikom deklaracije i implicitno će ga deklarisati pod imenom it kao što možemo videti iz navedenog primera. Ako povratna vrednost lambde nije Unit (Unit je ekvivalent Void tipu u Javi) onda poslednji (ili jedini) izraz u telu se ponaša kao povratna vrednost izraza.

Lamba sintaksa u Kotlinu je jedna od njegovih najboljih funkcionalnosti i daje mu mogućnost da se kod piše kao DSL tako da bude sintaksno validan i potpuno funkcionalan.