Kotlin er et generelt, gratis, åpen kildekode, statisk skrevet "pragmatisk" programmeringsspråk, opprinnelig designet for JVM (Java Virtual Machine) og Android som kombinerer objektorientert og funksjonell programmeringsfunksjon. Det er fokusert på interoperabilitet, sikkerhet, klarhet og verktøystøtte. Versjoner av Kotlin som er målrettet mot JavaScript ES5.1 og native code (ved bruk av LLVM) for en rekke prosessorer er også i produksjon.
Kotlin stammer fra JetBrains, selskapet bak IntelliJ IDEA, i 2010, og har vært åpen kildekode siden 2012. Kotlin-teamet har for tiden mer enn 90 heltidsmedlemmer fra JetBrains, og Kotlin-prosjektet på GitHub har mer enn 300 bidragsytere. JetBrains bruker Kotlin i mange av sine produkter, inkludert flaggskipet IntelliJ IDEA.
Kotlin som et mer kortfattet Java-språk
Ved første øyekast ser Kotlin ut som en mer kortfattet og strømlinjeformet versjon av Java. Tenk på skjermbildet ovenfor, hvor jeg automatisk har konvertert et Java-kodeeksempel (til venstre) til Kotlin. Legg merke til at den tankeløse gjentakelsen som ligger i å sette i gang Java-variabler har forsvunnet. Java-uttrykket
StringBuilder sb = ny StringBuilder ();
Blir i Kotlin
val sb = StringBuilder ()
Du kan se at funksjoner er definert med moro
nøkkelord, og at semikolon nå er valgfritt når nye linjer er til stede. De val
nøkkelord erklærer en skrivebeskyttet eiendom eller lokal variabel. Tilsvarende var
nøkkelord erklærer en foranderlig eiendom eller lokal variabel.
Likevel er Kotlin sterkt skrevet. De val
og var
nøkkelord kan bare brukes når typen kan utledes. Ellers må du oppgi typen. Type inferens ser ut til å bli bedre med hver utgivelse av Kotlin.
Ta en titt på funksjonserklæringen nær toppen av begge rutene. Returtypen i Java går foran prototypen, men i Kotlin etterfølger den prototypen, avgrenset med et kolon som i Pascal.
Det er ikke helt åpenbart fra dette eksemplet, men Kotlin har avslappet Java's krav om at funksjoner skal være klassemedlemmer. I Kotlin kan funksjoner deklareres på toppnivå i en fil, lokalt i andre funksjoner, som en medlemsfunksjon i en klasse eller et objekt, og som en utvidelsesfunksjon. Utvidelsesfunksjoner gir C # -lignende mulighet til å utvide en klasse med ny funksjonalitet uten å måtte arve fra klassen eller bruke noen form for designmønster som Decorator.
For Groovy-fans implementerer Kotlin byggere; faktisk kan Kotlin-byggere typesjekkes. Kotlin støtter delegerte egenskaper, som kan brukes til å implementere late egenskaper, observerbare egenskaper, vetoable egenskaper og kartlagte egenskaper.
Mange asynkrone mekanismer tilgjengelig på andre språk kan implementeres som biblioteker ved bruk av Kotlin coroutines. Dette inkluderer asynkronisering
/avvente
fra C # og ECMAScript, kanaler og velg fra Go, og generatorer
/utbytte
fra C # og Python.
Funksjonell programmering i Kotlin
Å tillate toppnivåfunksjoner er bare begynnelsen på den funksjonelle programmeringshistorien for Kotlin. Språket støtter også høyere ordensfunksjoner, anonyme funksjoner, lambdas, innebygde funksjoner, nedleggelser, halen rekursjon og generiske. Med andre ord har Kotlin alle funksjonene og fordelene ved et funksjonelt språk. Tenk for eksempel på følgende funksjonelle Kotlin-uttrykk.
Filtrering av en liste i Kotlin
val positive = list.filter {x -> x> 0}
For et enda kortere uttrykk, bruk den
når det bare er en enkelt parameter i lambda-funksjonen:
val positives = list.filter {it> 0}
Gjennomgang av et kart / en liste over par i Kotlin
for ((k, v) i kart) {println (“$ k -> $ v”)}
k
ogv
kan kalles hva som helst.
Bruke områder i Kotlin
for (jeg i 1..100) {...} // lukket område: inkluderer 100for (jeg i 1 til 100) {...} // halvåpent område: inkluderer ikke 100
for (x in 2..10 trinn 2) {...}
for (x in 10 nedtil 1) {...}
hvis (x i 1..10) { ... }
Ovennevnte eksempler visertil
søkeord samt bruk av områder.
Selv om Kotlin er et fullverdig funksjonelt programmeringsspråk, bevarer det meste av den objektorienterte naturen til Java som en alternativ programmeringsstil, noe som er veldig nyttig når du konverterer eksisterende Java-kode. Kotlin har klasser med konstruktører, sammen med nestede, indre og anonyme indre klasser, og det har grensesnitt som Java 8. Kotlin gjør ikke ha en ny
nøkkelord. For å opprette en klasseinstans, ring konstruktøren akkurat som en vanlig funksjon. Vi så det i skjermbildet ovenfor.
Kotlin har en arv fra en navngitt superklasse, og alle Kotlin-klassene har en standard superklasse Noen
, som er ikke det samme som Java-baseklassen java.lang.Objekt
. Noen
inneholder bare tre forhåndsdefinerte medlemsfunksjoner: er lik()
, hashCode ()
, og toString ()
.
Kotlin-klasser må merkes med åpen
nøkkelord for å tillate andre klasser å arve fra dem; Java-klasser er det motsatte, siden de er arvelige med mindre merket med endelig
nøkkelord. For å overstyre en superklassemetode, må selve metoden merkes åpen
, og underklassemetoden må merkes overstyring
. Dette er et stykke med Kotlins filosofi om å gjøre ting eksplisitte i stedet for å stole på standardinnstillinger. I dette spesielle tilfellet kan jeg se hvor Kotlins måte å eksplisitt markere baseklassemedlemmer som åpne for arv og avledede klassemedlemmer som tilsidesatte, unngår flere typer vanlige Java-feil.
Sikkerhetsfunksjoner i Kotlin
Når vi snakket om å unngå vanlige feil, var Kotlin designet for å eliminere faren for nullpekerreferanser og effektivisere håndteringen av nullverdier. Det gjør dette ved å lage en null
ulovlig for standardtyper, legge til nullbare typer og implementere snarveisnotasjoner for å håndtere tester for null.
For eksempel en vanlig variabel av typenString
kan ikke holdenull
:
var a: String = "abc"a = null // kompileringsfeil
Hvis du trenger å tillate null, for eksempel for å ha SQL-spørreresultater, kan du erklære en nullbar type ved å legge til et spørsmålstegn til typen, f.eks. String?
.
var b: Streng?b = null // ok
Beskyttelsene går litt lenger. Du kan bruke en ikke-nullbar type uten straffrihet, men du må teste en nullbar type for nullverdier før du bruker den.
For å unngå den detaljerte grammatikken som normalt er nødvendig for nulltesting, introduserer Kotlin a trygt samtale, skrevet ?.
. For eksempel, b? .lengde
returnerer b. lengde
hvis b
er ikke null
, og null
ellers. Typen av dette uttrykket er Int?
.
Med andre ord, b? .lengde
er en snarvei for hvis (b! = null) b. lengde ellers null
. Denne syntaksen lenker pent, og eliminerer ganske mye prolixlogikk, spesielt når et objekt ble fylt ut fra en serie databasespørsmål, hvorav noen kan ha mislyktes. For eksempel, bob? .avdeling? .hode? .navn
ville returnere navnet på Bobs avdelingsleder hvis Bob, avdelingen og avdelingslederen ikke er null.
For å utføre en bestemt operasjon bare for ikke-nullverdier, kan du bruke operatøren for sikker samtale ?.
sammen medla
:
val listWithNulls: List = listOf ("A", null)for (element i listWithNulls) {
element? .let {println (it)} // skriver ut A og ignorerer null}
Ofte vil du returnere en gyldig, men spesiell verdi fra et ugyldig uttrykk, vanligvis slik at du kan lagre den i en ikke-nullbar type. Det er en spesiell syntaks for dette som heter Elvis-operatøren (I kid you not), skrevet ?:
.
val l = b? .lengde?: -1
tilsvarer
val l: Int = if (b! = null) b. lengde ellers -1
På samme måte utelater Kotlin Java's sjekket unntak, som er kastbare forhold som må bli tatt. For eksempel JDK-signaturen
Appendable append (CharSequence csq) kaster IO Unntak;
krever at du fanger IO Unntak
hver gang du ringer en legge til
metode:
prøv {log.append (melding)
}
fangst (IOException e) {
// Gjør noe med unntak
}
Java-designerne syntes dette var en god idé, og det var en nettovinst for lekeprogrammer, så lenge programmørene implementerte noe fornuftig i å fange
klausul. Altfor ofte i store Java-programmer ser du imidlertid kode der det er obligatorisk å fange
klausul inneholder ingenting annet enn en kommentar: // todo: håndter dette
. Dette hjelper ingen, og sjekkede unntak viste seg å være et nettotap for store programmer.
Kotlin coroutines
Coroutines i Kotlin er i hovedsak lette tråder. Du starter dem med lansering
coroutine builder i sammenheng med noen CoroutineScope
. En av de mest nyttige coroutine omfang er runBlocking {}
, som gjelder omfanget av kodeblokken.
importer kotlinx.coroutines. *morsom hoved () = runBlocking {// dette: CoroutineScope
lansere {// lansere en ny coroutine i omfanget av runBlocking
forsinkelse (1000L) // forsinkelse som ikke blokkerer i 1 sekund
println ("Verden!")
}
println ("Hei,")
}
Denne koden produserer følgende utgang, med et sekund forsinkelse mellom linjer:
Hallo,
Verden!
Kotlin for Android
Frem til mai 2017 var de eneste offisielt støttede programmeringsspråkene for Android Java og C ++. Google kunngjorde offisiell støtte for Kotlin på Android på Google I / O 2017, og starter med Android Studio 3.0 Kotlin er innebygd i utviklingsverktøyet for Android. Kotlin kan legges til tidligere versjoner av Android Studio med en plugin-modul.
Kotlin kompilerer til samme byte-kode som Java, samarbeider med Java-klasser på naturlige måter og deler verktøyet med Java. Fordi det ikke er noen faste omkostninger for å ringe frem og tilbake mellom Kotlin og Java, er det veldig fornuftig å legge til Kotlin trinnvis til en Android-app som for tiden er i Java. De få tilfellene hvor interoperabiliteten mellom Kotlin og Java-kode mangler nåde, som for eksempel Java-settegenskaper, blir sjelden oppdaget og lett løst.
Pinterest var plakatbarnet for Android-apper skrevet i Kotlin allerede i november 2016, og det ble nevnt fremtredende på Google I / O 2017 som en del av Kotlin-kunngjøringen. I tillegg liker Kotlin-teamet å sitere appene Evernote, Trello, Square og Coursera for Android.
Kotlin mot Java
Spørsmålet om å velge Kotlin eller Java for ny utvikling har kommet opp mye i Android-samfunnet siden Google I / O-kunngjøringen, selv om folk allerede stilte spørsmålet i februar 2016 da Kotlin 1.0 ble sendt. Det korte svaret er at Kotlin-koden er tryggere og mer kortfattet enn Java-kode, og at Kotlin- og Java-filer kan eksistere sammen i Android-apper, slik at Kotlin ikke bare er nyttig for nye apper, men også for å utvide eksisterende Java-apper.
Det eneste overbevisende argumentet jeg har sett for å velge Java fremfor Kotlin, vil være tilfellet med komplette Android-nybegynnere. For dem kan det være en barriere for å overvinne gitt at historisk sett er de fleste Android-dokumentasjonene og eksemplene i Java. På den annen side er konvertering av Java til Kotlin i Android Studio et enkelt spørsmål om å lime inn Java-koden i en Kotlin-fil.
For nesten alle andre som gjør Android-utvikling, er fordelene med Kotlin overbevisende. Den typiske tiden som er angitt for en Java-utvikler for å lære Kotlin, er noen timer - en liten pris å betale for å eliminere nullreferansefeil, aktivere utvidelsesfunksjoner, støtte funksjonell programmering og legge til koroutiner. Det typiske grove estimatet indikerer omtrent 40 prosent kutt i antall linjer med kode fra Java til Kotlin.