Ohjelmointi

Mikä on Kotlin? Java-vaihtoehto selitetty

Kotlin on yleiskäyttöinen, ilmainen, avoimen lähdekoodin, staattisesti kirjoitettu "käytännöllinen" ohjelmointikieli, joka on alun perin suunniteltu JVM: lle (Java Virtual Machine) ja Androidille, ja jossa yhdistyvät olio- ja toiminnalliset ohjelmointiominaisuudet. Se keskittyy yhteentoimivuuteen, turvallisuuteen, selkeyteen ja työkalutukeen. Kotlinin versiot, jotka kohdistavat JavaScript ES5.1: n ja natiivikoodin (käyttäen LLVM: ää) useille prosessoreille, ovat myös tuotannossa.

Kotlin on syntynyt IntelliJ IDEA: n takana olevan yrityksen JetBrainsissa vuonna 2010 ja ollut avoimen lähdekoodin kanssa vuodesta 2012. Kotlin-tiimillä on tällä hetkellä yli 90 kokopäiväistä jäsentä JetBrainsista, ja Kotlin-projektissa GitHubissa on yli 300 avustajaa. JetBrains käyttää Kotlinia monissa tuotteissaan, mukaan lukien lippulaiva IntelliJ IDEA.

Kotlin ytimekkäämmänä Java-kielenä

Ensi silmäyksellä Kotlin näyttää suppeammalta ja virtaviivaisemmalta Java-versiolta. Harkitse yllä olevaa kuvakaappausta, jossa olen muuttanut Java-koodinäytteen (vasemmalla) Kotliniksi automaattisesti. Huomaa, että Java-muuttujien instantisointiin liittyvä järjetön toisto on kadonnut. Java-sanasto

StringBuilder sb = uusi StringBuilder ();

Tulee Kotliniin

val sb = StringBuilder ()

Voit nähdä, että toiminnot määritetään hauskaa avainsana ja että puolipisteet ovat nyt valinnaisia, kun uusia viivoja on läsnä. val avainsana ilmoittaa vain luku -ominaisuuden tai paikallisen muuttujan. Samoin var avainsana ilmoittaa muutettavan ominaisuuden tai paikallisen muuttujan.

Siitä huolimatta Kotlin on voimakkaasti kirjoitettu. val ja var avainsanoja voidaan käyttää vain, kun tyyppi voidaan päätellä. Muussa tapauksessa sinun on ilmoitettava tyyppi. Tyyppipäätelmä näyttää parantuvan Kotlinin jokaisen julkaisun yhteydessä.

Katso toimintoilmoitus lähellä molempien ruudujen yläosaa. Palautustyyppi Java-ohjelmassa edeltää prototyyppiä, mutta Kotlinissa se seuraa prototyyppiä, joka on erotettu kaksoispisteellä kuten Pascalissa.

Tämä ei ole täysin selvää tästä esimerkistä, mutta Kotlin on lieventänyt Java: n vaatimusta, että funktiot ovat luokan jäseniä. Kotlinissa funktiot voidaan ilmoittaa tiedostossa ylätasolla, paikallisesti muiden toimintojen sisällä, luokan tai objektin jäsentoimintoina ja laajennustoimintona. Laajennustoiminnot tarjoavat C #: n kaltaisen kyvyn laajentaa luokkaa uusilla toiminnoilla tarvitsematta periä luokalta tai käyttää minkään tyyppisiä suunnittelumalleja, kuten Decorator.

Groovy-faneille Kotlin toteuttaa rakentajia; itse asiassa Kotlinin rakentajille voidaan tehdä tyyppitarkastus. Kotlin tukee delegoituja ominaisuuksia, joita voidaan käyttää laiskojen ominaisuuksien, havaittavien ominaisuuksien, veto-oikeuksien ja kartoitettujen ominaisuuksien toteuttamiseen.

Monet muilla kielillä saatavat asynkroniset mekanismit voidaan toteuttaa kirjastoina käyttämällä Kotlinin korutiineja. Tämä sisältää asynkronoitu/odottaa kanavista C # ja ECMAScript, valitse Go ja generaattorit/saanto C #: ltä ja Pythonilta.

Toimiva ohjelmointi Kotlinissa

Ylätason toimintojen salliminen on vasta Kotlinin toiminnallisen ohjelmointitarinan alku. Kieli tukee myös korkeamman asteen toimintoja, nimettömiä toimintoja, lambdoja, sisäisiä toimintoja, sulkemisia, hännän rekursiota ja geneerisiä aineita. Toisin sanoen Kotlinilla on kaikki toiminnallisen kielen ominaisuudet ja edut. Harkitse esimerkiksi seuraavia toiminnallisia Kotlin-idioomeja.

Suodattaa luetteloa Kotlinissa

val positiiviset = luettelo.suodatin {x -> x> 0}

Käytä vielä lyhyempää ilmaisua se kun lambda-funktiossa on vain yksi parametri:

val positiiviset = list.filter {it> 0}

Kartan / pariluettelon kulkeminen Kotlinissa

((k, v) kartalla) {println (“$ k -> $ v”)}

k jav voidaan kutsua millä tahansa.

Alueiden käyttö Kotlinissa

varten (i sisään 1..100) {...} // suljettu alue: sisältää 100

varten (i sisään 1 - 100) {...} // puoliavoin alue: ei sisällä 100: ta

varten (x sisään 2..10 vaihe 2) {...}

varten (x sisään 10 alas 1) {...}

jos (x sisään 1..10) { ... }

Yllä olevat esimerkit osoittavatvarten avainsana sekä alueiden käyttö.

Vaikka Kotlin on täysimittainen toiminnallinen ohjelmointikieli, se säilyttää suurimman osan Java: n olio-luonteesta vaihtoehtoisena ohjelmointityylinä, mikä on erittäin kätevää muunnettaessa olemassa olevaa Java-koodia. Kotlinilla on luokkia konstruktoreiden kanssa, sisäkkäisten, sisäisten ja tuntemattomien sisäisten luokkien kanssa, ja sillä on käyttöliittymiä, kuten Java 8. Kotlin tekee ei olla Uusi avainsana. Luodaksesi luokan ilmentymän, kutsu konstruktoria aivan kuten tavallinen funktio. Näimme sen yllä olevassa kuvakaappauksessa.

Kotlinilla on yksi perintö nimetystä superluokasta, ja kaikilla Kotlin-luokilla on oletusarvoinen yliluokka Minkä tahansa, mikä on ei sama kuin Java-perusluokka java.lang.objekti. Minkä tahansa sisältää vain kolme ennalta määritettyä jäsenfunktiota: on yhtä suuri (), hash koodin()ja toString ().

Kotlin-luokat on merkittävä avata avainsana, jotta muut luokat voivat periä niistä; Java-luokat ovat tavallaan päinvastoin, koska ne ovat periytyviä ellei merkitty lopullinen avainsana. Yliluokan menetelmän ohittamiseksi itse menetelmä on merkittävä avata, ja alaluokan menetelmä on merkittävä ohittaa. Tämä on kaikki pala Kotlinin filosofian kanssa tehdä asioista selkeitä eikä luottaa oletuksiin. Tässä nimenomaisessa tapauksessa näen, missä Kotlinin tapa nimenomaisesti merkitä perusluokan jäsenet avoimiksi perinnölle ja johdetut luokan jäsenet ohituksiksi välttää monenlaisia ​​yleisiä Java-virheitä.

Turvallisuusominaisuudet Kotlinissa

Kun puhutaan yleisten virheiden välttämisestä, Kotlin suunniteltiin poistamaan nullosoittimen viittausten vaara ja tehostamaan nolla-arvojen käsittelyä. Se tekee tämän tekemällä a tyhjä laiton vakiotyypeille, lisäämällä mitätöitäviä tyyppejä ja toteuttamalla pikavalintamerkintöjä null-testien käsittelemiseksi.

Esimerkiksi säännöllinen tyypin muuttujaMerkkijono ei voi pitäätyhjä:

var a: Merkkijono = "abc"

a = null // kokoamisvirhe

Jos sinun on sallittava nollat, esimerkiksi SQL-kyselytulosten pitäminen, voit julistaa mitätöitävän tyypin liittämällä kysymykseen tyypin, esim. Merkkijono?.

var b: Jousisoitin?

b = nolla // ok

Suojaukset menevät hieman pidemmälle. Voit käyttää nollaamatonta tyyppiä rankaisematta, mutta sinun on testattava nollattamaton tyyppi nolla-arvojen varalta ennen sen käyttöä.

Välttääkseen tyhjentävään testaukseen normaalisti tarvittavan verboseen kieliopin Kotlin esittelee a turvallinen puhelu, kirjoitettu ?.. Esimerkiksi, b? .pituus palaa b. pituus jos b ei ole tyhjäja tyhjä muuten. Tämän lausekkeen tyyppi on Int?.

Toisin sanoen, b? .pituus on pikakuvake jos (b! = null) b. pituus muu nolla. Tämä syntaksiketju ketjuu hyvin, eliminoiden melko paljon prolix-logiikkaa, varsinkin kun objekti täytettiin tietokantakyselyjen sarjasta, joista jokin on saattanut epäonnistua. Esimerkiksi, bob? .osasto? .head? .nimi palauttaisi Bobin osastopäällikön nimen, jos Bob, osasto ja osastopäällikkö eivät ole nollia.

Voit suorittaa tietyn toiminnon vain ei-nolla-arvoille käyttämällä turva puheluoperaattoria ?. yhdessäpäästää:

val listWithNulls: Lista = listOf ("A", nolla)

haulle (item in listWithNulls) {

item? .let {println (it)} // tulostaa A ja jättää tyhjäksi}

Usein haluat palauttaa kelvollisen mutta erityisen arvon nollaamattomasta lausekkeesta, yleensä jotta voit tallentaa sen nollaamattomaan tyyppiin. Tälle on erityinen syntaksin nimi nimeltä Elvis-operaattori (minä poika sinua ei), kirjoitettu ?:.

val l = bp. pituus: -1

on vastaava 

val l: Int = if (b! = null) b. pituus muu -1

Kotlin jättää samalla tavoin Java tarkastamat poikkeukset, jotka ovat heitettäviä ehtoja on pakko olla kiinni. Esimerkiksi JDK-allekirjoitus

Liittyvä liite (CharSequence csq) -heittoja IOException;

vaatii sinua kiinni IOException joka kerta, kun soitat liitä menetelmä:

yrittää {

log.append (viesti)

}

saalis (IOException e) {

// Tee jotain lukuun ottamatta

}

Java-suunnittelijoiden mielestä tämä oli hyvä idea, ja se oli nettovoitto leluohjelmille, kunhan ohjelmoijat toteuttivat jotain järkevää saada kiinni lauseke. Aivan liian usein suurissa Java-ohjelmissa näet kuitenkin koodin, jossa pakollinen saada kiinni lauseke sisältää vain kommentin: // todo: käsittele tätä. Tämä ei auta ketään, ja tarkistetut poikkeukset osoittautuivat nettotappioiksi suurille ohjelmille.

Kotlin-korutiinit

Kotlinin korutiinit ovat olennaisesti kevyitä lankoja. Aloitat ne tuoda markkinoille Coroutine Builderin yhteydessä joihinkin CoroutineScope. Yksi hyödyllisimmistä korutiineista on runBlocking {}, joka koskee sen koodilohkon laajuutta.

tuo kotlinx.korutiinit. *

fun main () = runBlocking {// tämä: CoroutineScope

launch {// käynnistää uuden korutiinin runBlocking-sovelluksen sisällä

delay (1000L) // ei-estävä viive 1 sekunnin ajan

println ("Maailma!")

    }

println ("Hei")

}

Tämä koodi tuottaa seuraavan lähdön sekunnin viiveellä rivien välillä:

Hei,

Maailman!

Kotlin Androidille

Toukokuuhun 2017 saakka ainoat virallisesti tuetut Android-ohjelmointikielet olivat Java ja C ++. Google ilmoitti Kotlinin virallisesta tuesta Androidilla Google I / O 2017: ssä, ja Android Studio 3.0: sta alkaen Kotlin on sisäänrakennettu Android-kehitystyökalusarjaan. Kotlin voidaan lisätä Android Studion aiempiin versioihin laajennuksella.

Kotlin kääntyy samaan tavukoodiin kuin Java, toimii luonnollisesti Java-luokkien kanssa ja jakaa työkalunsa Java: n kanssa. Koska Kotlinin ja Java-palvelujen välillä ei ole yleiskustannuksia edestakaisin soittamiseen, Kotlinin lisääminen vähitellen Java-sovellukseen on järkevää. Harvat tapaukset, joissa Kotlinin ja Java-koodin välisestä yhteentoimivuudesta puuttuu armo, kuten Java-pelkät ominaisuudet, havaitaan harvoin ja korjataan helposti.

Pinterest oli Kotlinissa kirjoitettujen Android-sovellusten julisteen lapsi jo marraskuussa 2016, ja se mainittiin näkyvästi Google I / O 2017: ssä osana Kotlin-ilmoitusta. Lisäksi Kotlin-tiimi haluaa mainita Evernote-, Trello-, Square- ja Coursera-sovellukset Androidille.

Kotlin vs. Java

Kysymys siitä, valitaanko Kotlin vai Java uuteen kehitystyöhön, on tullut paljon esiin Android-yhteisössä Google I / O -ilmoituksen jälkeen, vaikka ihmiset kysyivät jo helmikuussa 2016, kun Kotlin 1.0 toimitettiin. Lyhyt vastaus on, että Kotlin-koodi on turvallisempi ja ytimekkäämpi kuin Java-koodi, ja että Kotlin- ja Java-tiedostot voivat esiintyä rinnakkain Android-sovelluksissa, joten Kotlin ei ole hyödyllinen vain uusien sovellusten lisäksi myös olemassa olevien Java-sovellusten laajentamiseen.

Ainoa vakuuttava argumentti, jonka olen nähnyt Java: n valitsemisesta Kotlinin sijaan, olisi täydellinen Android-kehittäjä. Heille saattaa olla este ylittämiselle, koska historiallisesti suurin osa Android-dokumentaatioista ja esimerkkeistä on Java-kielellä. Toisaalta Java-koodin muuntaminen Kotliniksi Android Studiossa on yksinkertainen asia liittää Java-koodi Kotlin-tiedostoksi.

Lähes kaikille muille, jotka tekevät Android-kehitystä, Kotlinin edut ovat pakottavia. Tyypillinen aika, jonka Java-kehittäjät mainitsevat Kotlinin oppimiseksi, on muutama tunti - pieni hinta maksettavaksi nollaviittausvirheiden poistamiseksi, laajennustoimintojen mahdollistamiseksi, toiminnallisen ohjelmoinnin tukemiseksi ja korutiinien lisäämiseksi. Tyypillinen karkea arvio osoittaa noin 40 prosentin leikkauksen koodirivien määrästä Javasta Kotliniin.