Što je Kotlin? Objašnjena je alternativa Java

Kotlin je općeniti, besplatni, otvoreni izvor, statički otkucan "pragmatični" programski jezik u početku dizajniran za JVM (Java virtualni stroj) i Android koji kombinira objektno orijentirane i funkcionalne programske značajke. Fokusiran je na interoperabilnost, sigurnost, preglednost i podršku alata. U izradi su i verzije Kotlina koje ciljaju JavaScript ES5.1 i izvorni kôd (koristeći LLVM) za brojne procesore.

Kotlin je nastao u JetBrainsu, tvrtki koja stoji iza IntelliJ IDEA, 2010. godine, a otvoren je izvor od 2012. Tim Kotlina trenutno ima više od 90 stalnih članova iz JetBrainsa, a projekt Kotlin na GitHubu ima više od 300 suradnika. JetBrains koristi Kotlin u mnogim svojim proizvodima, uključujući vodeći IntelliJ IDEA.

Kotlin kao sažetiji jezik Java

Na prvi pogled Kotlin izgleda kao sažetija i pojednostavljena inačica Jave. Razmotrite gornju snimku zaslona, ​​gdje sam automatski pretvorio uzorak Java koda (slijeva) u Kotlin. Primijetite da je bezumno ponavljanje svojstveno instanciranju Java varijabli nestalo. Java idiom

StringBuilder sb = novi StringBuilder ();

Postaje u Kotlinu

val sb = StringBuilder ()

Možete vidjeti da su funkcije definirane funključnom riječi i da su točke sa zarezom sada opcionalne kada su prisutni novi redovi. valKljučna riječ samo za čitanje imovine ili lokalne varijable. Slično tome, varključna riječ deklarira promjenjivo svojstvo ili lokalnu varijablu.

Ipak, Kotlin je snažno tipkan. valI varključne riječi mogu se koristiti samo kad je vrsta može se zaključiti. Inače trebate prijaviti tip. Čini se da se zaključivanje tipa poboljšava sa svakim izdanjem Kotlina.

Pogledajte deklaraciju funkcije pri vrhu obaju okna. Tip povratka u Javi prethodi prototipu, ali u Kotlinu nasljeđuje prototip, razgraničen dvotačkom kao u Pascalu.

Iz ovog primjera nije potpuno očito, ali Kotlin je ublažio Javin zahtjev da funkcije budu članovi klase. U Kotlinu se funkcije mogu deklarirati na najvišoj razini u datoteci, lokalno unutar drugih funkcija, kao funkcija člana unutar klase ili objekta i kao funkcija proširenja. Funkcije proširenja pružaju mogućnost sličnosti C # za proširivanje klase novom funkcionalnošću, bez potrebe za nasljeđivanjem iz klase ili korištenjem bilo koje vrste dizajnerskog uzorka, poput Dekoratora.

Za navijače Groovyja Kotlin provodi graditelje; zapravo se graditelji Kotlina mogu provjeriti. Kotlin podržava delegirana svojstva koja se mogu koristiti za primjenu lijenih svojstava, vidljivih svojstava, svojstava koja se mogu nadoknaditi i mapiranih svojstava.

Mnogi asinkroni mehanizmi dostupni na drugim jezicima mogu se implementirati kao knjižnice pomoću Kotlinovih podprograma. To uključuje async/ awaitiz C # i ECMAScript, kanale i odaberite iz Go, i generators/ yieldiz C # i Python.

Funkcionalno programiranje u Kotlinu

Dopuštanje funkcija najviše razine samo je početak priče o funkcionalnom programiranju za Kotlin. Jezik također podržava funkcije višeg reda, anonimne funkcije, lambde, ugrađene funkcije, zatvarače, rekurziju repa i generičke lijekove. Drugim riječima, Kotlin ima sve značajke i prednosti funkcionalnog jezika. Na primjer, razmotrite sljedeće funkcionalne Kotlinove idiome.

Filtriranje popisa u Kotlinu

val pozitivnih vrijednosti = list.filter {x -> x> 0}

Za još kraći izraz upotrijebite itkada u lambda funkciji postoji samo jedan parametar:

val pozitivnih vrijednosti = list.filter {it> 0}

Obilazak karte / popisa parova u Kotlinu

za ((k, v) na mapi) {println (“$ k -> $ v”)}

kv može se nazvati bilo kojim.

Korištenje raspona u Kotlinu

za (i u  1..100) {...} // zatvoreni raspon: uključuje 100

za (i u  1 do 100) {...} // poluotvoreni raspon: ne uključuje 100

za (x u  2..10, korak 2) {...}

za (x u  10 dolje na 1) {...}

ako (x u  1..10) {...}

Gornji primjeri prikazuju  for ključnu riječ kao i upotrebu raspona.

Iako je Kotlin punopravni funkcionalni programski jezik, on čuva većinu objektno orijentirane prirode Jave kao alternativnog stila programiranja, što je vrlo zgodno pri pretvaranju postojećeg Java koda. Kotlin ima nastavu s graditeljima, zajedno s ugniježđena, unutarnjim i anonimnih unutarnje klase, a ima sučelja kao što su Java 8. Kotlin nema ni imati newključnu riječ. Da biste stvorili instancu klase, pozovite konstruktor baš poput uobičajene funkcije. To smo vidjeli na gornjoj snimci zaslona.

Kotlin ima jedno nasljeđivanje od imenovane superklase, a sve klase Kotlin imaju zadanu superklasu Any, koja nije isto što i osnovna klasa Java java.lang.Object. Anysadrži samo tri predefinirane funkcije članova: equals(), hashCode()i toString().

Kotlin klase moraju biti označene openključnom riječi kako bi se omogućilo da druge klase nasljeđuju od njih; Java klase su nešto suprotno, jer su nasljedne ako nisu označene finalključnom riječi. Da bi se nadjačala metoda superrazreda, sama metoda mora biti označena open, a metoda podrazreda mora biti označena override. Sve je to dio Kotlinove filozofije da stvari bude eksplicitna, a ne da se oslanja na zadane postavke. U ovom konkretnom slučaju mogu vidjeti gdje Kotlinov način eksplicitnog označavanja članova osnovne klase kao otvorenih za nasljeđivanje i izvedenih članova klase kao nadjačavanja izbjegava nekoliko vrsta uobičajenih Java pogrešaka.

Sigurnosne značajke u Kotlinu

Govoreći o izbjegavanju uobičajenih pogrešaka, Kotlin je dizajniran da eliminira opasnost od null referenci pokazivača i pojednostavi rukovanje null vrijednostima. To čini nullnezakonitim za standardne tipove, dodavanjem poništenih tipova i primjenom notacija prečaca za rukovanje testovima za nulu.

Na primjer, regularna varijabla tipa  ne može sadržavati  :String null

var a: Niz = "abc"

a = null // pogreška kompilacije

Ako trebate dopustiti nule, na primjer za zadržavanje rezultata SQL upita, možete proglasiti poništavajući tip dodavanjem upitnika tipu, npr String?.

var  b: Niz?

b = null  // ok

Zaštita ide malo dalje. Možete nekažnjeno koristiti tip koji se ne može nullirati, ali prije nego što ga upotrebljavate, morate testirati null vrijednosti za null vrijednosti.

Kako bi izbjegao opsežnu gramatiku koja je obično potrebna za null testiranje, Kotlin uvodi siguran poziv , napisan ?.. Na primjer, vraća ako nije , a inače. Tip ovog izraza je .b?.length b.lengthbnullnullInt?

Drugim riječima, b?.lengthprečac je za if (b != null) b.length else null. Ova sintaksa lijepo se veže, eliminirajući dosta logike proliksa, pogotovo kada je objekt popunjen iz niza upita baze podataka, od kojih bilo koji možda nije uspio. Na primjer, bob?.department?.head?.namevratilo bi ime šefa odjela Boba ako Bob, odjel i šef odjela nisu null.

Da biste izveli određenu operaciju samo za ne-null vrijednosti, možete koristiti operatora sigurnog poziva ?.zajedno sa  let:

val listWithNulls: List = listOf ("A", null)

za (stavka u listWithNulls) {

      stavka? .let {println (it)} // ispisuje A i ignorira null}

Često želite vratiti valjanu, ali posebnu vrijednost iz izraza koji se može poništiti, obično tako da ga možete spremiti u ne-poništavajući tip. Za to postoji posebna sintaksa nazvana Elvis operator (šalim se da ne), napisana ?:.

val l = b? .duljina?: -1

je ekvivalent od 

val l: Int = ako (b! = null) b.duljina else -1

Na isti način, Kotlin izostavlja provjerene iznimke Jave, a to su uvjeti za bacanje koji se moraju uhvatiti. Na primjer, potpis JDK

Dodatak koji se može dodati (CharSequence csq) baca  IOException;

zahtijeva da uhvatite IOExceptionsvaki put kad pozovete appendmetodu:

probaj {

  log.append (poruka)

}

catch (IOException e) {

  // Učinite nešto s iznimkom

}

Dizajneri Jave smatrali su da je ovo dobra ideja i da je to neto dobit za programe igračaka, sve dok su programeri implementirali nešto razumno u catchklauzulu. Prečesto u velikim Java programa, međutim, vidjeti kod u kojem je obavezna catchklauzula sadrži ništa osim komentar: //todo: handle this. To nikome ne pomaže, a provjerene iznimke pokazale su se neto gubicima za velike programe.

Kotlin koroutine

Koreutine u Kotlinu u osnovi su lagane niti. Počinjete ih s launchgraditeljem koroutina u kontekstu nekih CoroutineScope. Jedan od najkorisnijih opsega podprograma je runBlocking{}, koji se odnosi na opseg njegovog bloka koda.

uvezite kotlinx.coroutines. *

fun main () = runBlocking {// ovo: CoroutineScope

    pokretanje {// pokretanje nove podprograma u opsegu runBlocking

        kašnjenje (1000L) // neblokirajuće kašnjenje za 1 sekundu

        println ("Svijet!")

    }

    println ("Pozdrav,")

}

Ovaj kod daje sljedeći izlaz, s odgodom od jedne sekunde između redaka:

Zdravo,

Svijet!

Kotlin za Android

Do svibnja 2017. jedini službeno podržani programski jezici za Android bili su Java i C ++. Google je najavio službenu podršku za Kotlin na Androidu na Google I / O 2017., a počevši od Android Studija 3.0 Kotlin je ugrađen u set razvojnih alata za Android. Kotlin se može dodati u starije verzije Android Studija s dodatkom.

Kotlin kompajlira u isti bajt kôd kao Java, surađuje s Java klasama na prirodan način i dijeli svoje alate s Javom. Budući da između Kotlina i Jave nema dodatnih troškova za pozivanje naprijed-natrag, postupno dodavanje Kotlina u Android aplikaciju koja se trenutno nalazi na Javi ima sasvim smisla. Rijetki slučajevi u kojima interoperabilnost između Kotlina i Java koda nedostaje gracioznosti, poput svojstava samo za Java, rijetko se mogu sresti i lako ih popraviti.

Pinterest je podređeno dijete za Android aplikacije napisano u Kotlinu već u studenom 2016. godine, a istaknuto je na Google I / O 2017. kao dio najave Kotlina. Uz to, tim Kotlina voli citirati aplikacije Evernote, Trello, Square i Coursera za Android.

Kotlin protiv Jave

Pitanje da li odabrati Kotlin ili Javu za novi razvoj često se nameće u Android zajednici od najave Google I / O-a, iako su ljudi već postavljali pitanje u veljači 2016. kada je Kotlin 1.0 isporučen. Kratki je odgovor da je Kotlin kod sigurniji i sažetiji od Java koda te da datoteke Kotlin i Java mogu koegzistirati u Android aplikacijama, tako da Kotlin nije koristan samo za nove aplikacije, već i za proširenje postojećih Java aplikacija.

Jedini uvjerljivi argument koji sam vidio za odabir Jave umjesto Kotlina bio bi slučaj kompletnih novaka za razvoj Androida. Za njih bi mogla postojati prepreka za prevladavanje s obzirom na to da je u povijesti većina Android dokumentacije i primjera na Javi. S druge strane, pretvaranje Jave u Kotlin u Android Studiju jednostavno je pitanje lijepljenja Java koda u datoteku Kotlin.

Gotovo svi drugi koji se bave Androidovim razvojem, prednosti Kotlina su uvjerljive. Uobičajeno vrijeme za razvoj programera Jave da nauči Kotlin je nekoliko sati - mala cijena koju treba platiti za uklanjanje pogrešaka s nulom, omogućavanje funkcija proširenja, podržavanje funkcionalnog programiranja i dodavanje programskih programa. Tipična gruba procjena ukazuje na približno 40 posto smanjenja broja linija koda od Jave do Kotlina.