Programmering

Hvad er Kotlin? Java-alternativet forklaret

Kotlin er et generelt formål, gratis, open source, statisk skrevet "pragmatisk" programmeringssprog, der oprindeligt er designet til JVM (Java Virtual Machine) og Android, der kombinerer objektorienterede og funktionelle programmeringsfunktioner. Det er fokuseret på interoperabilitet, sikkerhed, klarhed og værktøjsstøtte. Versioner af Kotlin målrettet mod JavaScript ES5.1 og native-kode (ved hjælp af LLVM) til en række processorer er også i produktion.

Kotlin stammer fra JetBrains, firmaet bag IntelliJ IDEA, i 2010 og har været open source siden 2012. Kotlin-teamet har i øjeblikket mere end 90 fuldtidsmedlemmer fra JetBrains, og Kotlin-projektet på GitHub har mere end 300 bidragydere. JetBrains bruger Kotlin i mange af sine produkter, herunder dets flagskib IntelliJ IDEA.

Kotlin som et mere kortfattet Java-sprog

Ved første øjekast ligner Kotlin en mere kortfattet og strømlinet version af Java. Overvej skærmbilledet ovenfor, hvor jeg automatisk har konverteret en Java-kodeeksempel (til venstre) til Kotlin. Bemærk, at den tankeløse gentagelse, der er forbundet med at instantere Java-variabler, er forsvundet. Java-idiomet

StringBuilder sb = ny StringBuilder ();

Bliver i Kotlin

val sb = StringBuilder ()

Du kan se, at funktioner er defineret med sjovt nøgleord, og at semikolon nu er valgfri, når der findes nye linjer. Det val nøgleord erklærer en skrivebeskyttet ejendom eller lokal variabel. Tilsvarende er var nøgleord erklærer en ændret egenskab eller lokal variabel.

Ikke desto mindre er Kotlin stærkt skrevet. Det val og var nøgleord kan kun bruges, når typen kan udledes. Ellers skal du erklære typen. Type inferens ser ud til at blive bedre med hver udgivelse af Kotlin.

Se på funktionserklæringen øverst på begge ruder. Returtypen i Java går forud for prototypen, men i Kotlin efterfølger den prototypen, afgrænset med et kolon som i Pascal.

Det fremgår ikke helt af dette eksempel, men Kotlin har lempet Java's krav om, at funktioner skal være klassemedlemmer. I Kotlin kan funktioner erklæres på øverste niveau i en fil lokalt inde i andre funktioner, som en medlemsfunktion i en klasse eller et objekt og som en udvidelsesfunktion. Udvidelsesfunktioner giver den C # -lignende mulighed for at udvide en klasse med ny funktionalitet uden at skulle arve fra klassen eller bruge nogen form for designmønster som f.eks. Decorator.

For Groovy-fans implementerer Kotlin bygherrer; faktisk kan Kotlin-bygherrer typekontrolleres. Kotlin understøtter delegerede egenskaber, som kan bruges til at implementere dovne egenskaber, observerbare egenskaber, vetoable egenskaber og kortlagte egenskaber.

Mange asynkrone mekanismer tilgængelige på andre sprog kan implementeres som biblioteker ved hjælp af Kotlin coroutines. Dette inkluderer asynkronisering/vente fra C # og ECMAScript, kanaler og vælg fra Go, og generatorer/udbytte fra C # og Python.

Funktionel programmering i Kotlin

Tilladelse af topniveaufunktioner er kun begyndelsen på den funktionelle programmeringshistorie for Kotlin. Sproget understøtter også højere ordensfunktioner, anonyme funktioner, lambdas, inline-funktioner, lukninger, halerekursion og generiske. Med andre ord har Kotlin alle funktionerne og fordelene ved et funktionelt sprog. Overvej f.eks. Følgende funktionelle Kotlin-idiomer.

Filtrering af en liste i Kotlin

val positive = list.filter {x -> x> 0}

Brug et endnu kortere udtryk det når der kun er en enkelt parameter i lambda-funktionen:

val positives = list.filter {it> 0}

Gennemse et kort / en liste over par i Kotlin

for ((k, v) på kort) {println (“$ k -> $ v”)}

k ogv kan kaldes hvad som helst.

Brug af intervaller i Kotlin

for (jeg i 1..100) {...} // lukket område: inkluderer 100

for (jeg i 1 indtil 100) {...} // halvåbent interval: inkluderer ikke 100

for (x in 2..10 trin 2) {...}

for (x in 10 ned til 1) {...}

hvis (x i 1..10) { ... }

Ovenstående eksempler visertil nøgleord samt brugen af ​​intervaller.

Selvom Kotlin er et fuldt udviklet funktionelt programmeringssprog, bevarer det meste af den objektorienterede karakter af Java som en alternativ programmeringsstil, hvilket er meget praktisk, når man konverterer eksisterende Java-kode. Kotlin har klasser med konstruktører sammen med indlejrede, indre og anonyme indre klasser, og det har grænseflader som Java 8. Kotlin gør ikke have en ny nøgleord. For at oprette en klasseinstans skal du kalde konstruktøren ligesom en almindelig funktion. Vi så det i skærmbilledet ovenfor.

Kotlin har en enkelt arv fra en navngivet superklasse, og alle Kotlin-klasser har en standard superklasse Nogen, som er ikke det samme som Java-baseklassen java.lang.Objekt. Nogen indeholder kun tre foruddefinerede medlemsfunktioner: lige med(), hashCode ()og toString ().

Kotlin-klasser skal markeres med åben nøgleord for at tillade andre klasser at arve fra dem; Java-klasser er det modsatte, da de er arvelige med mindre markeret med endelig nøgleord. For at tilsidesætte en superklassemetode skal selve metoden være markeret åben, og underklassemetoden skal markeres tilsidesætte. Dette er alt sammen et stykke med Kotlins filosofi om at gøre ting eksplicit snarere end at stole på standardindstillinger. I dette særlige tilfælde kan jeg se, hvor Kotlins måde at eksplicit markere baseklassemedlemmer som åbne for arv og afledte klassemedlemmer som tilsidesættelse undgår flere slags almindelige Java-fejl.

Sikkerhedsfunktioner i Kotlin

Når vi taler om at undgå almindelige fejl, blev Kotlin designet til at eliminere faren for nulmarkeringsreferencer og strømline håndteringen af ​​nulværdier. Det gør dette ved at lave en nul ulovligt for standardtyper, tilføjelse af ugyldige typer og implementering af genvejsnotationer for at håndtere tests for null.

For eksempel en regelmæssig variabel af typenSnor kan ikke holdenul:

var a: String = "abc"

a = null // kompileringsfejl

Hvis du har brug for at tillade nuller, for eksempel at holde SQL-forespørgselsresultater, kan du erklære en ugyldig type ved at tilføje et spørgsmålstegn til typen, f.eks. Snor?.

var b: Streng?

b = null // Okay

Beskyttelsen går lidt længere. Du kan bruge en ikke-nulbar type med straffrihed, men du skal teste en nulbar type for nulværdier, før du bruger den.

For at undgå den detaljerede grammatik, der normalt er nødvendig til null-test, introducerer Kotlin en sikkert opkald, skrevet ?.. For eksempel, b? .længde vender tilbage b. længde hvis b er ikke nulog nul Ellers. Typen af ​​dette udtryk er Int?.

Med andre ord, b? .længde er en genvej til hvis (b! = null) b. længde ellers null. Denne syntaks kæder pænt og eliminerer en hel del prolix-logik, især når et objekt blev udfyldt fra en række databaseforespørgsler, hvoraf nogen muligvis mislykkedes. For eksempel, bob? .afdeling? .hoved? .navn ville returnere navnet på Bobs afdelingsleder, hvis Bob, afdelingen og afdelingslederen ikke er nul.

For at udføre en bestemt operation kun for værdier, der ikke er nul, kan du bruge den sikre opkaldsoperatør ?. sammen medlade:

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

for (element i listWithNulls) {

element? .let {println (it)} // udskriver A og ignorerer null}

Ofte vil du returnere en gyldig, men speciel værdi fra et ugyldigt udtryk, normalt så du kan gemme det i en ikke-ugyldig type. Der er en særlig syntaks til dette kaldet Elvis-operatøren (jeg beder dig ikke), skrevet ?:.

val l = b? .længde?: -1

svarer til 

val l: Int = hvis (b! = null) b. længde ellers -1

På samme måde udelader Kotlin Java's kontrollerede undtagelser, som er forhold, der kan kastes skal blive fanget. For eksempel JDK-signaturen

Appendable append (CharSequence csq) kaster IOUndtagelse;

kræver, at du fanger IOUndtagelse hver gang du ringer til en Tilføj metode:

prøve {

log.append (besked)

}

fangst (IOException e) {

// Gør noget med undtagelsen

}

Java-designerne syntes, det var en god idé, og det var en nettovinst for legetøjsprogrammer, så længe programmørerne implementerede noget fornuftigt i fangst klausul. Alt for ofte i store Java-programmer ser du dog kode, hvor det obligatoriske fangst klausul indeholder intet andet end en kommentar: // todo: håndter dette. Dette hjælper ingen, og kontrollerede undtagelser viste sig at være et nettotab for store programmer.

Kotlin coroutines

Coroutines i Kotlin er i det væsentlige lette tråde. Du starter dem med lancering coroutine builder i sammenhæng med nogle CoroutineScope. Et af de mest nyttige koroutinomfang er runBlocking {}, der gælder for rækkevidden af ​​dens kodeblok.

importer kotlinx.coroutines. *

sjov main () = runBlocking {// dette: CoroutineScope

lancere {// lancere en ny coroutine i omfanget af runBlocking

forsinkelse (1000L) // ikke-blokerende forsinkelse i 1 sekund

println ("Verden!")

    }

println ("Hej")

}

Denne kode producerer følgende output med en forsinkelse på et sekund mellem linjer:

Hej,

Verden!

Kotlin til Android

Indtil maj 2017 var de eneste officielt understøttede programmeringssprog til Android Java og C ++. Google annoncerede officiel support til Kotlin på Android på Google I / O 2017, og startende med Android Studio 3.0 Kotlin er indbygget i Android-udviklingsværktøjssættet. Kotlin kan føjes til tidligere versioner af Android Studio med et plug-in.

Kotlin kompilerer til den samme bytekode som Java, interopererer med Java-klasser på naturlige måder og deler sit værktøj med Java. Fordi der ikke er nogen faste omkostninger til at ringe frem og tilbage mellem Kotlin og Java, føjer Kotlin trinvist til en Android-app, der i øjeblikket er i Java, giver mening. De få tilfælde, hvor interoperabiliteten mellem Kotlin og Java-kode mangler nåde, såsom Java-set-only-egenskaber, er sjældent stødt på og let løst.

Pinterest var plakatbarnet til Android-apps skrevet i Kotlin allerede i november 2016, og det blev nævnt fremtrædende på Google I / O 2017 som en del af Kotlin-meddelelsen. Derudover kan Kotlin-teamet gerne citere Evernote, Trello, Square og Coursera apps til Android.

Kotlin vs. Java

Spørgsmålet om, hvorvidt man skal vælge Kotlin eller Java til nyudvikling, er kommet meget op i Android-samfundet siden Google I / O-meddelelsen, selvom folk allerede stillede spørgsmålet i februar 2016, da Kotlin 1.0 blev sendt. Det korte svar er, at Kotlin-koden er sikrere og mere kortfattet end Java-kode, og at Kotlin- og Java-filer kan eksistere sammen i Android-apps, så Kotlin ikke kun er nyttigt til nye apps, men også til at udvide eksisterende Java-apps.

Det eneste overbevisende argument, jeg har set for at vælge Java frem for Kotlin, ville være tilfældet med komplette Android-nybegyndere. For dem kan der være en barriere for at overvinde, da historisk set er de fleste Android-dokumenter og eksempler i Java. På den anden side er konvertering af Java til Kotlin i Android Studio et simpelt spørgsmål om at indsætte Java-koden i en Kotlin-fil.

For næsten alle andre, der laver Android-udvikling, er fordelene ved Kotlin overbevisende. Den typiske tid, der er citeret for en Java-udvikler for at lære Kotlin, er et par timer - en lille pris at betale for at fjerne nulreferencefejl, aktivere udvidelsesfunktioner, understøtte funktionel programmering og tilføje coroutines. Det typiske grove skøn angiver cirka 40 procent nedskæring i antallet af kodelinjer fra Java til Kotlin.

$config[zx-auto] not found$config[zx-overlay] not found