Programmering

Hva er Kotlin? Java-alternativet forklart

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 100

for (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 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.

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