Programavimas

Kodėl Kotlinas? Aštuonios funkcijos, kurios galėtų įtikinti „Java“ kūrėjus pereiti

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.

  1. Švari, kompaktiška sintaksė
  2. Vieno tipo sistema (beveik)
  3. Visiškas saugumas
  4. Funkcijos ir funkcinis programavimas
  5. Duomenų klasės
  6. Pratęsimai
  7. Operatoriaus perkrova
  8. 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.

  1. pagrindinis yra aukščiausio lygio funkcija; tai yra, Kotlino funkcijų nereikia įdėti į klasę.
  2. Nėra viešoji statiška modifikatoriai. Nors Kotlin turi matomumo modifikatorius, numatytasis nustatymas yra visuomenės ir gali būti praleista. Kotlinas taip pat nepalaiko statinis modifikatorius, bet šiuo atveju jo nereikia, nes pagrindinis yra aukščiausio lygio funkcija.
  3. 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 kaip argumentas: Masyvas.
  4. Funkcijai grąžinimo tipas nenurodytas. Kur „Java“ naudoja tuštuma, Kotlin naudoja Vienetasir jei funkcijos grąžinimo tipas yra Vienetas, jis gali būti praleistas.
  5. Š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 = 5arba 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

Laiko rezultatai (sekundėmis)
„Java“

(dvigubai)

„Java“

(Dvigubai)

Kotlinas

(„DoubleArray“)

Kotlinas

(Masyvas)

7.3029.836.8115.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

Spektaklis (Mflops)
„Java“Kotlinas
1818.221815.78