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 100for (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 nul
og 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.