Oficialiai išleista 2016 m., „Kotlin“ pastaraisiais metais sulaukė daug dėmesio, ypač todėl, kad „Google“ paskelbė palaikanti „Kotlin“ kaip „Java“ alternatyvą „Android“ platformose. Neseniai paskelbus sprendimą padaryti „Kotlin“ pageidaujama „Android“ kalba, jums gali kilti klausimas, ar laikas pradėti mokytis naujos programavimo kalbos. Tokiu atveju šis straipsnis gali padėti apsispręsti.
Kotlino išleidimo istorija
„Kotlin“ buvo paskelbta 2011 m., Tačiau pirmasis stabilus leidimas, 1.0 versija, pasirodė tik 2016 m. Kalba yra nemokama ir atviro kodo, kurią sukūrė „JetBrains“, o jos pagrindinis kalbos dizaineris yra Andrejus Breslavas. „Kotlin 1.3.40“ buvo išleistas 2019 m. Birželio mėn.
Apie Kotliną
„Kotlin“ yra šiuolaikiška, statiškai įvesta programavimo kalba, turinti tiek objektinio, tiek funkcinio programavimo konstrukcijas. Jis skirtas kelioms platformoms, įskaitant JVM, ir yra visiškai suderinamas su „Java“. Daugeliu atžvilgių „Kotlin“ gali atrodyti „Java“, jei ji būtų sukurta šiandien. Šiame straipsnyje aš pristatau aštuonias „Kotlin“ funkcijas, kurias, manau, „Java“ kūrėjai su malonumu atras.
- Švari, kompaktiška sintaksė
- Vieno tipo sistema (beveik)
- Visiškas saugumas
- Funkcijos ir funkcinis programavimas
- Duomenų klasės
- Pratęsimai
- Operatoriaus perkrova
- Aukščiausio lygio objektai ir „Singleton“ modelis
Labas pasauli! Kotlinas prieš Java
1 sąraše yra privalomas „Sveikas, pasauli!“ funkcija parašyta Kotlin.
Sąrašas 1. "Sveikas, pasauli!" Kotline
linksmas pagrindinis () {println ("Sveikas, pasauli!")}
Kad ir koks paprastas šis pavyzdys atskleidžia pagrindinius „Java“ skirtumus.
pagrindinis
yra aukščiausio lygio funkcija; tai yra, Kotlino funkcijų nereikia įdėti į klasę.- Nėra
viešoji statiška
modifikatoriai. Nors Kotlin turi matomumo modifikatorius, numatytasis nustatymas yravisuomenės
ir gali būti praleista. Kotlinas taip pat nepalaikostatinis
modifikatorius, bet šiuo atveju jo nereikia, nespagrindinis
yra aukščiausio lygio funkcija. - Nuo „Kotlin 1.3“ eilutės masyvo parametras
pagrindinis
nėra būtinas ir gali būti praleistas, jei nenaudojamas. Jei reikia, jis būtų deklaruojamas kaipargumentas: Masyvas
. - Funkcijai grąžinimo tipas nenurodytas. Kur „Java“ naudoja
tuštuma
, Kotlin naudojaVienetas
ir jei funkcijos grąžinimo tipas yraVienetas
, jis gali būti praleistas. - Šioje funkcijoje nėra kabliataškių. Kotline kabliataškiai yra neprivalomi, todėl linijų pertraukos yra reikšmingos.
Tai yra apžvalga, tačiau reikia daug daugiau sužinoti apie tai, kuo „Kotlin“ skiriasi nuo „Java“ ir, daugeliu atvejų, ją tobulina.
1. Švaresnė, kompaktiškesnė sintaksė
„Java“ dažnai kritikuojama dėl to, kad ji yra per daug verdi, tačiau tam tikra nekalbamybė gali būti jūsų draugas, ypač jei tai daro šaltinio kodą suprantamesnį. Kalbos dizaino uždavinys yra sumažinti daugiažodiškumą, išlaikant aiškumą, ir aš manau, kad Kotlinas žengia daug šio iššūkio.
Kaip matėte 1 sąraše, Kotlinui nereikia kabliataškių ir jis leidžia praleisti grąžinimo tipą Vienetas
funkcijos. Apsvarstykime keletą kitų funkcijų, padedančių „Kotlin“ padaryti švaresne, kompaktiškesne „Java“ alternatyva.
Tipo išvada
Kotlin galite paskelbti kintamąjį kaip var x: Int = 5
arba galite naudoti trumpesnę, bet taip pat aiškią versiją var x = 5
. (Nors „Java“ dabar palaiko var
deklaracijų, ši funkcija pasirodė tik „Java 10“, ilgai po to, kai ši funkcija pasirodė Kotline.)
Kotlinas taip pat turi val
tik skaitomų kintamųjų deklaracijos, kurios yra analogiškos „Java“ kintamiesiems, kurie buvo paskelbti kaip galutinis
, tai reiškia, kad kintamojo negalima priskirti iš naujo. 2 sąraše pateikiamas pavyzdys.
Sąrašas 2. Tik skaitomi kintamieji Kotlin
val x = 5 ... x = 6 // KLAIDA: NESUDARYS
Ypatybės ir laukai
Kur „Java“ turi laukus, „Kotlin“ turi savybių. Nuosavybės deklaruojamos ir prieinamos panašiai kaip viešieji „Java“ laukai, tačiau Kotlinas teikia numatytąsias ypatybių prieigos / mutatoriaus funkcijų realizacijas; tai yra, Kotlinas teikia gauti ()
funkcijos val
savybes ir tiek gauti ()
ir rinkinys ()
funkcijos var
savybes. Tinkintos versijos gauti ()
ir rinkinys ()
prireikus gali būti įgyvendinta.
Daugumoje Kotlino savybių bus pagrindiniai laukai, tačiau galima apibrėžti a apskaičiuota nuosavybė, kuris iš esmės yra a gauti ()
funkcija be pagrindo lauko. Pavyzdžiui, klasė, atstovaujanti asmeniui, gali turėti savybę Gimimo data
ir apskaičiuota nuosavybė amžiaus
.
Numatytasis, palyginti su aiškiu importu
„Java“ netiesiogiai importuoja paketuose apibrėžtas klases java.lang
, bet visos kitos klasės turi būti aiškiai importuojamos. Todėl daugelis „Java“ šaltinio failų pradedami importuojant kolekcijos klases iš java.util
, I / O klasės nuo java.io
, ir taip toliau. Pagal nutylėjimą Kotlinas netiesiogiai importuoja kotlinas. *
, kuris yra maždaug analogiškas Java importavimui java.lang. *
, bet Kotlinas taip pat importuoja kotlin.io. *
, kotlin.collections. *
ir klasės iš kelių kitų paketų. Dėl to „Kotlin“ šaltinio failams paprastai reikia mažiau aiškių importų nei „Java“ šaltinio failams, ypač klasėms, naudojančioms kolekcijas ir (arba) standartinius įvesties / išvesties failus.
Nereikia skambinti „naujiems“ konstruktoriams
Kotlin, raktinis žodis naujas
Naujo objekto sukūrimui nereikia. Norėdami paskambinti konstruktoriui, tiesiog naudokite klasės pavadinimą su skliaustais. Java kodas
Studentas s = naujas studentas (...); // arba var s = naujas studentas (...);
Kotlin gali būti parašyta taip:
var s = studentas (...)
Styginių šablonai
Stygose gali būti šablonų išraiškos, kurios yra išraiškos, kurios vertinamos į rezultatus įterpiant į eilutę. Šablono išraiška prasideda dolerio ženklu ($) ir susideda iš paprasto vardo arba nuo savavališkos išraiškos garbanotaisiais breketais. Styginių šablonai gali sutrumpinti eilutės išraiškas, nes sumažėja aiškių eilučių sujungimo poreikis. Pavyzdžiui, šis „Java“ kodas
println ("Vardas:" + vardas + ", skyrius:" + skyrius);
galėtų būti pakeistas trumpesniu, bet lygiaverčiu Kotlino kodu.
println ("Pavadinimas: $ vardas, Departamentas: $ dept")
Pratęsia ir įgyvendina
„Java“ programuotojai žino, kad klasė gali pratęsti
kita klasė ir įgyvendinti
viena ar daugiau sąsajų. Kotline nėra sintaksinio skirtumo tarp šių dviejų panašių sąvokų; Kotlinas abiem naudoja dvitaškį. Pavyzdžiui, „Java“ kodas
viešoji klasė Studentų pratęsimai Asmeniniai padargai Palyginami
būtų paprasčiau parašyti Kotlin taip:
klasės mokinys: asmuo, palyginamas
Nėra patikrintų išimčių
Kotlinas palaiko išimtis panašiai kaip „Java“ su vienu dideliu skirtumu - „Kotlin“ neturi patikrintų išimčių. Nors jie buvo gerų ketinimų, patikrintos „Java“ išimtys buvo plačiai kritikuojamos. Jūs vis dar galite mesti
ir pagauti
išimčių, tačiau „Kotlin“ kompiliatorius nepriverčia jūsų jų gaudyti.
Pertvarkymas
Galvoti apie destruktyvus kaip paprastą būdą suskaidyti daiktą į jo dalis. Pertvarkymo deklaracija sukuria kelis kintamuosius vienu metu. Žemiau pateiktame 3 sąraše pateikiami keli pavyzdžiai. Pirmame pavyzdyje tarkime, kad kintamasis studentas
yra klasės egzempliorius Studentas
, kuris apibrėžtas 12 sąraše žemiau. Antrasis pavyzdys paimtas tiesiai iš Kotlino dokumentų.
Sąrašas 3. Pertvarkymo pavyzdžiai
val (_, lName, fName) = studentas // ištraukite vardą ir pavardę iš mokinio objekto // pabraukimas reiškia, kad mums nereikia student.id ((raktas, reikšmė) žemėlapyje) {// padaryti kažką su raktu ir vertė}
teiginiai ir posakiai „jei“
Kotline, jei
gali būti naudojamas valdymo srautui, kaip ir „Java“, tačiau jis taip pat gali būti naudojamas kaip išraiška. „Java“ kriptinis trijų komponentų operatorius (?:
) pakeičiamas aiškesniu, bet kiek ilgesniu jei
išraiška. Pavyzdžiui, „Java“ kodas
dvigubai max = x> = y? x: y
būtų parašyta Kotlin taip:
val max = if (x> = y), tada x kitas y
Kotlinas šiuo atveju yra šiek tiek žodingesnis nei „Java“, tačiau, be abejo, sintaksė yra aiškesnė.
„kai“ pakeičia jungiklį
Mano mažiausiai mėgstama valdymo struktūra C tipo kalbomis yra perjungti
pareiškimas. Kotlinas pakeičia perjungti
pareiškimas su a kada
pareiškimas. 4 sąrašas paimtas tiesiai iš Kotlino dokumentų. Pastebėti, kad pertrauka
teiginiai nereikalingi, ir jūs galite lengvai įtraukti reikšmių diapazonus.
Sąrašas 4. „kada“ sakinys Kotlin
kai (x) {1..10 -> spausdinti ("x yra diapazone") validNumbers -> spausdinti ("x galioja")! 10..20 -> spausdinti ("x yra už diapazono ribų ") else -> print (" nė vienas iš aukščiau išvardytų ")}
Pabandykite perrašyti 4 sąrašą kaip tradicinę C / Java perjungti
pareiškimą, ir jūs suprasite, kaip mums geriau sekasi su Kotlin kada
pareiškimas. Be to, panašus į jei
, kada
gali būti naudojamas kaip išraiška. Tokiu atveju patenkintos šakos vertė tampa visos išraiškos verte.
Perjungti išraiškas „Java“
„Java 12“ pristatė jungiklių išraiškas. Panašus į Kotlino kada
, „Java“ jungiklio išraiškos nereikia pertrauka
teiginius, ir jie gali būti naudojami kaip teiginiai ar posakiai. Norėdami daugiau sužinoti apie jungiklių išraiškas „Java“, skaitykite skyrelyje „Loopas, perjungimas ar pertrauka? Sprendimas ir pakartojimas su teiginiais“.
2. Vieno tipo sistema (beveik)
„Java“ turi dvi atskirų tipų sistemas: primityvius tipus ir nuorodų tipus (dar kitaip, objektus). Yra daugybė priežasčių, kodėl „Java“ apima dvi atskiro tipo sistemas. Tiesą sakant, tai netiesa. Kaip aprašyta mano straipsnyje „Primityvų laikymasis„ Java “atvejis“, primityviems tipams iš tikrųjų yra tik viena priežastis - atlikimas. Panašiai kaip „Scala“, „Kotlin“ turi tik vieno tipo sistemą, nes Kotline iš esmės nėra skirtumo tarp primityvių tipų ir referencinių tipų. Kotlinas, jei įmanoma, naudoja primityvius tipus, tačiau prireikus naudos objektus.
Taigi kodėl „beveik“ įspėjimas? Kadangi „Kotlin“ taip pat turi specializuotas klases, kurios atstovauja primityvių tipų masyvams be viršutinio autobusų srauto: „IntArray“
, „DoubleArray“
, ir taip toliau. JVM „DoubleArray“
yra įgyvendinamas kaip dvigubai []
. Ar naudoja „DoubleArray“
iš tikrųjų pakeisti? Pažiūrėkime.
1 etalonas: Matricos daugyba
Pateikdamas „Java“ primityvų atvejį, aš parodžiau kelis palyginamuosius rezultatus, lygindamas „Java“ primityvus, „Java wrapper“ klases ir panašų kitų kalbų kodą. Vienas iš etalonų buvo paprastas matricos dauginimas. Norėdami palyginti „Kotlin“ našumą su „Java“, aš sukūriau dvi „Kotlin“ matricos daugybos realizacijas, vieną naudodamas Masyvas
ir vienas naudojant Masyvas
. 5 sąraše rodomas „Kotlin“ įgyvendinimas naudojant Masyvas
.
5. Matricos dauginimas Kotline
linksmas dauginimasis (a: Masyvas, b: Masyvas): Masyvas {if (! checkArgs (a, b)) metimas Išimtis ("Matricos nesuderinamos dauginti") val nRows = a.size val nCols = b [0]. dydis val rezultatas = Masyvas (nRows, {_ -> DoubleArray (nCols, {_ -> 0.0})}) (eilutėNum 0 iki nRows) {už (colNum 0 iki nCols) {var suma = 0,0 už (i per 0, kol [0] .size) suma + = a [rowNum] [i] * b [i] [colNum] rezultatas [rowNum] [colNum] = sum}} grąžins rezultatą}
Toliau palyginau dviejų „Kotlin“ versijų našumą su „Java“ dvigubai
ir Java su Dvigubai
, vykdydamas visus keturis etalonus mano dabartiniame nešiojamajame kompiuteryje. Kadangi vykdant kiekvieną etaloną yra nedidelis „triukšmas“, visas versijas vykdžiau tris kartus ir vidutiniškai įvertinau rezultatus, kurie apibendrinti 1 lentelėje.
1 lentelė. Matricos daugybos etalono vykdymo laikas
„Java“ ( | „Java“ ( | Kotlinas ( | Kotlinas ( |
7.30 | 29.83 | 6.81 | 15.82 |
Mane šiek tiek nustebino šie rezultatai, ir aš nupiešiu du išsinešimus. Pirma, „Kotlin“ pasirodymas naudojant „DoubleArray“
yra akivaizdžiai pranašesnis už „Kotlin“ veikimą naudojant Masyvas
, kuris yra akivaizdžiai pranašesnis už „Java“, naudojant „wrapper“ klasę Dvigubai
. Antra, „Kotlin“ pasirodymas naudojant „DoubleArray“
yra palyginamas su - ir šiame pavyzdyje šiek tiek geresniu - Java veikimu naudojant primityvųjį tipą dvigubai
.
Akivaizdu, kad Kotlinas atliko puikų darbą optimizuodamas atskirų tipų sistemų poreikį, išskyrus poreikį naudoti tokias klases kaip „DoubleArray“
vietoj Masyvas
.
2 etalonas: „SciMark 2.0“
Mano straipsnyje apie primityvius dalykus taip pat buvo antras, labiau mokslinis etalonas, žinomas kaip „SciMark 2.0“, kuris yra „Java“ etalonas moksliniam ir skaitmeniniam skaičiavimui, kurį gali gauti Nacionalinis standartų ir technologijos institutas (NIST). „SciMark“ etalonas matuoja kelių skaičiavimo procedūrų našumą ir apytiksliai pateikia bendrą rezultatą Mflops (milijonai slankiojo kablelio operacijų per sekundę). Taigi šiam etalonui geriau naudoti didesnius skaičius.
Padedamas „IntelliJ IDEA“ konvertuojau „SciMark“ etalono „Java“ versiją į „Kotlin“. „IntelliJ IDEA“ automatiškai konvertuojama dvigubai []
ir int []
„Java“ į „DoubleArray“
ir „IntArray“
Kotline. Tada palyginau „Java“ versiją naudodamas primityvus su „Kotlin“ versija „DoubleArray“
ir „IntArray“
. Kaip ir anksčiau, abi versijas vykdžiau tris kartus ir vidutiniškai įvertinau rezultatus, kurie apibendrinti 2 lentelėje. Vėlgi lentelėje rodomi apytiksliai palyginami rezultatai.
2 lentelė. „SciMark“ etalono vykdymo laikas
„Java“ | Kotlinas |
1818.22 | 1815.78 |