Kotlin je splošni, brezplačni, odprtokodni, statično natipkan "pragmatični" programski jezik, ki je bil prvotno zasnovan za JVM (Java Virtual Machine) in Android, ki združuje objektno usmerjene in funkcionalne programske funkcije. Osredotočen je na interoperabilnost, varnost, jasnost in podporo orodjem. V izdelavi so tudi različice Kotlina, ki ciljajo na JavaScript ES5.1 in izvorno kodo (z uporabo LLVM) za številne procesorje.
Kotlin je pri JetBrainsu, podjetju, ki stoji za IntelliJ IDEA, nastal leta 2010, odprtokodna pa je od leta 2012. Ekipa Kotlin trenutno šteje več kot 90 redno zaposlenih iz JetBrains, projekt Kotlin na GitHub pa več kot 300 sodelavcev. JetBrains uporablja Kotlin v številnih svojih izdelkih, vključno s svojim vodilnim IntelliJ IDEA.

Kotlin kot bolj jedrnat jezik Java
Kotlin je na prvi pogled videti bolj strnjena in racionalizirana različica Jave. Upoštevajte zgornji posnetek zaslona, kjer sem vzorec kode Java (levo) samodejno pretvoril v Kotlin. Opazite, da je brezumno ponavljanje, ki je značilno za instanciranje spremenljivk Java, izginilo. Idiom Java
StringBuilder sb = novo StringBuilder ();
Postane v Kotlinu
val sb = StringBuilder ()
Vidite lahko, da so funkcije definirane s zabavno
ključna beseda in da so podpičja zdaj neobvezna, če so prisotne nove vrstice. The val
ključna beseda razglasi lastnost samo za branje ali lokalno spremenljivko. Podobno je var
ključna beseda razglasi spremenljivo lastnost ali lokalno spremenljivko.
Kotlin je kljub temu močno tipkan. The val
in var
ključne besede je mogoče uporabiti le, če je mogoče določiti vrsto. V nasprotnem primeru morate prijaviti vrsto. Zdi se, da se sklepanje na tip izboljša z vsako izdajo Kotlina.
Oglejte si izjavo funkcije na vrhu obeh podoken. Tip vrnitve v Javi je pred prototipom, v Kotlinu pa sledi prototipu, označen z dvopičjem kot v Pascalu.
Iz tega primera ni povsem očitno, vendar je Kotlin sprostil Javino zahtevo, da so funkcije člani razreda. V Kotlinu se lahko funkcije razglasijo na najvišji ravni v datoteki, lokalno znotraj drugih funkcij, kot funkcija člana znotraj razreda ali predmeta in kot razširitvena funkcija. Funkcije razširitve omogočajo podobnost C #, da razširi razred z novo funkcionalnostjo, ne da bi ga bilo treba podedovati iz razreda ali uporabiti kakršen koli vzorec oblikovanja, kot je Decorator.
Za ljubitelje Groovyja Kotlin izvaja gradbenike; pravzaprav je mogoče gradnike Kotlin preveriti. Kotlin podpira delegirane lastnosti, ki se lahko uporabljajo za izvajanje lenih lastnosti, opaznih lastnosti, lastnosti, ki jih je mogoče uporabiti, in preslikane lastnosti.
Številne asinhrone mehanizme, ki so na voljo v drugih jezikih, je mogoče uporabiti kot knjižnice z uporabo Kotlinovih podprogramov. To vključuje asinh
/čakati
iz C # in ECMAScript, kanalov in izberite med Go in generatorji
/donos
iz C # in Pythona.
Funkcionalno programiranje v Kotlinu
Omogočanje funkcij na najvišji ravni je za Kotlin šele začetek zgodbe o funkcionalnem programiranju. Jezik podpira tudi funkcije višjega reda, anonimne funkcije, lambde, vrstne funkcije, zapore, rekurzijo repa in generike. Z drugimi besedami, Kotlin ima vse značilnosti in prednosti funkcionalnega jezika. Upoštevajte na primer naslednje funkcionalne Kotlinove idiome.
Filtriranje seznama v Kotlinu
val pozitivnih vrednosti = list.filter {x -> x> 0}
Za še krajši izraz uporabite to
kadar je v funkciji lambda samo en parameter:
val pozitivnih = list.filter {it> 0}
Premikanje po zemljevidu / seznamu parov v Kotlinu
za ((k, v) na zemljevidu) {println (“$ k -> $ v”)}
k
inv
lahko imenujemo karkoli.
Uporaba obsegov v Kotlinu
za (i v 1..100) {...} // zaprto območje: vključuje 100za (i v 1 do 100) {...} // polodprto območje: ne vključuje 100
za (x in 2..10 2. korak) {...}
za (x in 10 navzdol do 1) {...}
če (x v 1..10) { ... }
Zgornji primeri kažejoza
ključna beseda, kot tudi uporaba obsegov.
Čeprav je Kotlin polnopravni funkcionalni programski jezik, ohranja večino objektno usmerjene narave Jave kot alternativnega sloga programiranja, kar je zelo priročno pri pretvorbi obstoječe kode Java. Kotlin ima razrede s konstruktorji, skupaj z ugnezdenimi, notranjimi in anonimnimi notranjimi razredi in ima vmesnike, kot je Java 8. Kotlin ima ne imajo a novo
ključna beseda. Če želite ustvariti primerek razreda, pokličite konstruktor tako kot običajno funkcijo. To smo videli na zgornjem posnetku zaslona.
Kotlin ima enojno dedovanje iz imenovanega superrazreda in vsi razredi Kotlin imajo privzeti superrazred Kaj
, kateri je ne enako kot osnovni razred Java java.lang.Object
. Kaj
vsebuje le tri vnaprej določene funkcije članov: enako ()
, hashCode ()
, in toString ()
.
Kotlinovi razredi morajo biti označeni z odprto
ključna beseda, da lahko drugi razredi podedujejo od njih; Razredi Java so nekako nasprotni, saj so podedljivi razen označena z dokončno
ključna beseda. Če želite preglasiti metodo superrazreda, mora biti metoda označena sama odprto
, metoda podrazreda pa mora biti označena preglasiti
. To je vse skupaj s Kotlinovo filozofijo, da stvari naredi eksplicitno, ne pa da se zanaša na privzete vrednosti. V tem konkretnem primeru vidim, kje se Kotlinov način, da izrecno označi člane osnovnega razreda kot odprte za dedovanje in izpeljane člane razreda kot preglasitve, izogne več vrstam pogostih napak Java.
Varnostne funkcije v Kotlinu
Ko smo že govorili o izogibanju pogostim napakam, je bil Kotlin zasnovan tako, da odpravi nevarnost sklicev na ničelne kazalce in poenostavi ravnanje z ničelnimi vrednostmi. To naredi tako, da naredi nič
nezakonito za standardne tipe, dodajanje ničelnih vrst in izvajanje zapisov bližnjic za obdelavo testov za ničelno vrednost.
Na primer navadna spremenljivka tipaVrvica
ne more držatinič
:
var a: String = "abc"a = null // napaka pri prevajanju
Če morate dovoliti ničelne vrednosti, na primer za zadrževanje rezultatov poizvedbe SQL, lahko deklarirate ničelno vrsto, tako da ji dodate vprašaj, npr. Vrvica?
.
var b: Niz?b = nič // v redu
Zaščita gre malo dlje. Neznačilni tip lahko uporabljate nekaznovano, vendar morate pred uporabo preizkusiti ničelni tip za ničelne vrednosti.
Da bi se izognil podrobni slovnici, ki je običajno potrebna za nično testiranje, Kotlin uvaja a varen klic, napisano ?.
. Na primer, b? .dolžina
vrne b. dolžina
če b
ni nič
, in nič
drugače. Tip tega izraza je Int?
.
Z drugimi besedami, b? .dolžina
je bližnjica za if (b! = null) b.length else null
. Ta sintaksa se lepo veže in odstrani precej logike prolix, še posebej, če je bil objekt izpolnjen iz vrste poizvedb v zbirki podatkov, katere od njih morda niso uspele. Na primer, bob? .oddelek? .glava? .ime
bi vrnil ime Bobovega vodje oddelka, če Bob, oddelek in vodja oddelka niso nič.
Če želite izvesti določeno operacijo samo za vrednosti, ki niso nule, lahko uporabite operaterja varnega klica ?.
skupaj zpustiti
:
val listWithNulls: List = listOf ("A", null)za (element na seznamuWithNulls) {
element? .let {println (it)} // natisne A in prezre null}
Pogosto želite vrniti veljavno, a posebno vrednost iz ničelnega izraza, običajno zato, da ga lahko shranite v nenulibilni tip. Za to obstaja posebna sintaksa, imenovana Elvis operator (se hecam, da ne), napisana ?:
.
val l = b? .dolžina?: -1
je enakovredno
val l: Int = če (b! = null) b.length else -1
Kotlin izpušča preverjene izjeme Jave, ki so razmere, ki jih je mogoče vrniti mora biti ujet. Na primer podpis JDK
Vrzeti, ki jih je mogoče dodati (CharSequence csq) IOException;
zahteva, da ujamete IOException
vsakič, ko pokličete priloži
metoda:
poskusite {log.append (sporočilo)
}
ulov (IOException e) {
// Naredite nekaj z izjemo
}
Oblikovalci Jave so menili, da je to dobra ideja in je bila za igralne programe čista zmaga, če so programerji v ulov
klavzulo. V velikih programih Java pa prepogosto vidite kodo, v kateri je obvezno ulov
klavzula vsebuje samo komentar: // todo: reši to
. To nikomur ne pomaga, preverjene izjeme pa so se izkazale kot čista izguba za velike programe.
Kotlin koroutine
Koreutine v Kotlinu so v bistvu lahke niti. Začnete jih z kosilo
gradnik koroutin v kontekstu nekaterih CoroutineScope
. Eden najbolj uporabnih področij uporabe je runBlocking {}
, ki velja za obseg bloka kode.
uvozi kotlinx.coroutines. *fun main () = runBlocking {// to: CoroutineScope
zagon {// zaženite novo podprogram v obsegu runBlocking
zakasnitev (1000L) // neblokirajoča zakasnitev za 1 sekundo
println ("Svet!")
}
println ("Pozdravljeni,")
}
Ta koda ustvari naslednji izhod z eno sekundo zakasnitve med vrsticami:
Zdravo,
Svet!
Kotlin za Android
Do maja 2017 sta bila edina uradno podprta programska jezika za Android Java in C ++. Google je na Googlovem vhodu / izidu 2017 napovedal uradno podporo za Kotlin v Androidu, začenši z Android Studio 3.0 pa je Kotlin vgrajen v nabor orodij za razvoj Androida. Kotlin je mogoče dodati v starejše različice Android Studio z vtičnikom.
Kotlin prevaja v isto bajtno kodo kot Java, na naraven način sodeluje z razredi Java in svoje orodje deli z Javo. Ker med Kotlinom in Javo ni nobenih dodatnih stroškov za klicanje naprej in nazaj, je postopno dodajanje Kotlina v aplikacijo za Android, ki je trenutno v Javi, povsem smiselno. Redkih primerov, ko interoperabilnost med kodami Kotlin in Javo primanjkuje, kot so lastnosti, ki so nastavljene samo za Javo, je le redko in jih je mogoče enostavno popraviti.
Pinterest je bil podrejeni otrok za aplikacije za Android, napisan v Kotlinu že novembra 2016, in je bil omenjen na Google I / O 2017 kot del Kotlinove objave. Poleg tega ekipa Kotlin rada navaja aplikacije Evernote, Trello, Square in Coursera za Android.
Kotlin proti Javi
Vprašanje, ali izbrati Kotlin ali Javo za nov razvoj, se v skupnosti Android pogosto pojavlja že od objave Google I / O, čeprav so ga ljudje že zastavili februarja 2016, ko je bil Kotlin 1.0 poslan. Kratek odgovor je, da je koda Kotlin varnejša in bolj jedrnata kot koda Java in da datoteke Kotlin in Java lahko sobivata v aplikacijah za Android, tako da Kotlin ni uporaben samo za nove aplikacije, temveč tudi za razširitev obstoječih aplikacij Java.
Edini prepričljiv argument, ki sem ga videl pri izbiri Jave pred Kotlinom, bi bil primer popolnih novincev za razvoj Androida. Zanje bi lahko obstajala ovira, ki jo je treba premagati, saj je v preteklosti večina dokumentacije in primerov za Android v Javi. Po drugi strani pa je pretvorba Jave v Kotlin v programu Android Studio preprosta stvar lepljenja kode Java v datoteko Kotlin.
Skoraj vsi drugi, ki se ukvarjajo z razvojem Androida, so prednosti Kotlina prepričljive. Običajni čas, da se razvijalec Jave nauči Kotlina, je nekaj ur - majhna cena, ki jo je treba plačati za odpravljanje ničelnih referenčnih napak, omogočanje funkcij razširitve, podpiranje funkcionalnega programiranja in dodajanje programov. Tipična groba ocena kaže na približno 40-odstotno zmanjšanje števila vrstic kode od Jave do Kotlina.