I denne tredelte serien har vi tatt en grundig titt på Kotlin, et moderne programmeringsspråk for Android-apper som kjører i Java Virtual Machine (JVM).
Mens Kotlin er langt fra det eneste alternative programmeringsspråket som er designet for å kjøre på JVM, har det mye å tilby Android-utviklere. Så hvis du nylig har følt deg frustrert over Java-delen av Android-utviklingen, så vil du vurdere å gi Kotlin en tur.
I de første to delene dekket vi følgende:
Java vs Kotlin: Skal du bruke Kotlin til Android Development? I denne innledende artikkelen så vi på hva Kotlin har å tilby Android-utviklere, samt noen potensielle ulemper du må være oppmerksom på før du avgjør om Kotlin passer for deg.
Koding Funksjonelle Android-apper i Kotlin: Komme i gang. I dette innlegget så vi på hvordan du konfigurerer Android Studio for å støtte Kotlin-koden, opprettet en Android-app skrevet helt i Kotlin, kjente oss med Kotlins grunnleggende syntaks, og til og med så hvordan bytte til Kotlin kan bety at du aldri trenger å skrive en annen findViewById
en gang til.
Nå som du er i en posisjon der du kan erstatte Java-delene av prosjektene dine med Kotlin-koden som har det samme sluttresultatet, la oss gå videre og se på noen områder der Kotlin har fordel over Java.
I denne siste avdrag skal vi utforske noen av de mer avanserte Kotlin-funksjonene som lar deg utføre oppgaver som enten ville være mye mer verbose i Java eller ikke oppnåelig med Java alene.
Ved slutten av denne artikkelen vil du vite hvordan du bruker Kotlin til å trimme massevis av boilerplate-kode fra prosjektene dine, utvide eksisterende klasser med ny funksjonalitet og gjøre dem frustrerende NullPointerException
er en ting fra fortiden.
Hvor mange ganger har du løp inn i en NullPointerException
mens du tester koden din? I dag er det ganske klart at tillat utviklere å tilordne null til en objektreferanse ikke var beste design valg! Forsøk på å bruke en objektreferanse som har null-verdi, er en stor kilde til feil i mange forskjellige programmeringsspråk, inkludert Java. Faktisk, NullPointerException
har vært en så stor kilde til irritasjon som Java 8 la til @NonNull
annotasjon spesielt for å prøve og fikse denne feilen i sitt type system.
Problemet ligger i det faktum at Java lar deg sette en variabel av en referansetype til null, men hvis du til enhver tid prøver å bruke en referanse som peker til null, vil variabelen ikke vite hvor du skal se fordi objektet egentlig ikke eksisterer. På dette tidspunktet kan JVM ikke fortsette den normale utførelsesveien - søknaden din vil krasje, og du vil støte på a NullPointerException
. Hvis du prøver å kalle en metode på nullreferanse eller forsøker å få tilgang til et felt med nullreferanse, utløses begge a NullPointerException
.
Hvis du har opplevd smerten av NullPointerException
s (og har ikke vi alle på et tidspunkt?) så er det gode nyheter: null sikkerhet er integrert i Kotlin-språket. Kotlin-kompilatoren tillater ikke at du tilordner en nullverdi til en objektreferanse, da det spesifikt kontrollerer koden din for nærvær av mulige nullobjekter under kompilering. Hvis Kotlin-kompilatoren oppdager at a NullPointerException
kan kastes ved kjøretid, da vil koden din mislykkes ved kompileringstid.
Kotlins null-sikre design betyr at du nesten aldri møter null situasjoner og NullPointerException
s stammer fra Kotlin-koden. Det eneste unntaket er hvis du utløser en NullPointerException
ved feil bruk av en av Kotlins spesielle operatører, eller hvis du bruker en av disse operatørene til å bevisst utløse a NullPointerException
(vi vil utforske operatører mer detaljert senere i denne artikkelen).
I Kotlin anses alle variabler som null nullerbar som standard, så forsøk på å tilordne null-verdi til en variabel vil resultere i en kompileringsfeil. For eksempel vil ikke følgende kompilere:
var eksempel: String = null
Hvis du vil at en variabel skal akseptere en nullverdi, må du eksplisitt markere den variabelen som nullerbar. Dette er det motsatte av Java, hvor hvert objekt anses som nullstillbart som standard, noe som er en stor del av hvorfor NullPointerException
s er så vanlige i Java.
Hvis du vil eksplisitt erklære at en variabel kan akseptere en nullverdi, må du legge til en ?
til variabel typen. For eksempel, følgende vil kompilere:
var eksempel: String? = null
Når kompilatoren ser denne typen erklæring, gjenkjenner den at dette er en nullerbar variabel og vil behandle den litt annerledes, spesielt for å hindre deg i å kalle en metode eller få tilgang til en eiendom på denne nullable-referansen, og igjen hjelpe deg med å unngå de irriterende NullPointerExceptions . For eksempel vil ikke følgende kompilere:
var eksempel: String? = null example.size
Selv om Kotlins design betyr at det er vanskelig å støte på NullPointerExceptions som kommer fra Kotlin-koden, hvis prosjektet inneholder en blanding av Kotlin og Java, kan Java-delene av prosjektet fortsatt være en kilde til NullPointerExceptions.
Hvis du jobber med en blanding av Kotlin- og Java-filer (eller kanskje du spesielt trenger å presentere nullverdier i Kotlin-koden), inneholder Kotlin en rekke spesialoperasjoner som er utformet for å hjelpe deg med å håndtere alle nullverdier du møter.
Operatøren for sikker samtale ?.
gir deg mulighet til å håndtere referanser som muligens kan inneholde nullverdier, samtidig som du sikrer at ethvert anrop til denne referansen ikke vil resultere i en NullPointerException
.
Når du legger til en Safe Call-operatør til en referanse, vil denne referansen bli testet for null-verdi. Hvis verdien er null, returneres null, ellers vil objektreferansen bli brukt som du opprinnelig ment. Mens du kunne oppnå samme effekt ved hjelp av en hvis
uttalelsen, kan operatøren for sikker anrop tillate deg å utføre det samme arbeidet i mye mindre kode.
For eksempel vil følgende komme tilbake a.size
bare hvis en
er ikke null-ellers, vil det returnere null:
en? .size
Du kan også selge Safe Call-operatører sammen:
val nummer = person? .address? .street? .number
Hvis noen av uttrykkene i denne serien er null, blir resultatet null, ellers blir resultatet den ønskede verdien.
Noen ganger vil du ha et uttrykk som potensielt kan inneholde null verdi, men du vil ikke kaste en NullPointerException
selv om denne verdien gjør viser seg å være null.
I disse situasjonene kan du bruke Kotlins Elvis operatør ?:
å gi en alternativ verdi som vil bli brukt når verdien viser seg å være null, noe som også er en god måte å forhindre forplantning av nullverdier i koden på.
La oss se på et eksempel på Elvis-operatøren i aksjon:
morsomt settnavn (navn: String?) brukernavn = navn?: "N / A"
Her, hvis verdien til venstre for Elvis-operatøren er ikke null, så returneres verdien til venstre side (Navn
). Men hvis verdien til venstre for Elvis-operatøren er null så vil uttrykket til høyre bli returnert, som i dette tilfellet er N / A
.
Hvis du noen gang vil tvinge Kotlin-koden til å kaste NullPointerException i Java-stil, kan du bruke !!
operatør. For eksempel:
val nummer = første navn !! lengde
Her bruker vi !!
operatør for å hevde at fornavn
variabel er ikke null. Så lenge som fornavn
inneholder en gyldig referanse, så er variabelt nummer satt til lengde
av strengen. Hvis fornavn
inneholder ikke en gyldig referanse, da vil Kotlin kaste en NullPointerException
.
Et lambda-uttrykk representerer en anonym funksjon. Lambdas er en fin måte å redusere mengden kode som trengs for å utføre noen oppgaver som kommer opp hele tiden i Android developmment-for eksempel skrive lyttere og tilbakeringinger.
Java 8 har introdusert native lambda-uttrykk, og disse støttes nå i Android Nougat. Selv om denne funksjonen ikke er noe som er unikt for Kotlin, er det fortsatt verdt å ta en titt på dem. I tillegg, hvis du jobber med et prosjekt som inneholder både Kotlin og Java-kode, kan du nå bruke lambda-uttrykk i hele prosjektet ditt!
Et lambda-uttrykk omfatter et sett med parametre, en lambda-operatør (->
) og en funksjonsdel, arrangert i følgende format:
x: Int, y: Int -> x + y
Når du bygger lambda-uttrykk i Kotlin, må du huske følgende regler:
Lambda-uttrykket skal være omgitt av krøllete braces.
Hvis uttrykket inneholder noen parametre, må du deklarere dem før ->
pil symbol.
Hvis du jobber med flere parametere, bør du skille dem med kommaer.
Kroppen går etter ->
skilt.
Den viktigste fordelen med lambda-uttrykk er at de lar deg definere anonyme funksjoner og deretter overføre disse funksjonene umiddelbart som et uttrykk. Dette gjør at du kan utføre mange vanlige utviklingsoppgaver mer kortfattet enn du kunne i Java 7 og tidligere, da du ikke lenger trenger å skrive spesifikasjonen av funksjonen i en abstrakt klasse eller grensesnitt. Faktisk mangler lambdas i Java 7 og tidligere en stor del av hvorfor skrive lyttere og tilbakeringinger har tradisjonelt vært så clunky i Android.
La oss se på et vanlig eksempel: legge til en klikklytter til en knapp. I Java 7 og tidligere vil dette typisk kreve følgende kode:
button.setOnClickListener (new View.OnClickListener () @Override public void onClick (Vis v) Toast.makeText (dette, "Knapp klikket", Toast.LENGTH_LONG) .show (););
Imidlertid lar Kotlin lambda-funksjonene deg sette en klikklytter ved hjelp av en enkelt linje med kode:
button.setOnClickListener (view -> toast ("Button clicked"))
Allerede er dette mye mer kortfattet og lettere å lese, men vi kan gå videre - hvis en funksjon tar en annen funksjon som den siste parameteren, så kan du passere den utenfor parenteslisten:
button.setOnClickListener () toast ("Button clicked")
Og hvis funksjonen bare har en parameter som er en funksjon, kan du fjerne parentesene helt:
button.setOnClickListener toast ("Button clicked")
I likhet med C #, lar Kotlin deg legge til ny funksjonalitet i eksisterende klasser som du ellers ikke ville kunne endre. Så hvis du tror en klasse mangler en nyttig metode, så hvorfor ikke legge det til, via en utvidelsesfunksjon?
Du oppretter en utvidelsesfunksjon ved å prefikse navnet på klassen du vil utvide til navnet på funksjonen du oppretter.
For eksempel:
morsom AppCompatActivity.toast (msg: String) Toast.makeText (dette, msg, Toast.LENGTH_LONG) .show ()
Legg merke til at dette
Søkeord inne i utvidelsesfunksjonen tilsvarer AppCompatActivity
eksempel som .skål
er påkalt.
I dette eksemplet trenger du bare å importere AppComptActivity
og Skål
klasser inn i din .kt fil og så er du klar til å ringe .
notat på tilfeller av den utvidede klassen.
Når det gjelder Android-utvikling, kan du finne utvidelsesfunksjoner som er spesielt nyttige for å gi ViewGroups
evnen til å blåse seg selv, for eksempel:
morsom ViewGroup.inflate (@LayoutRes layoutRes: Int, attachToRoot: Boolean = false): Se return LayoutInflater .fra (kontekst) .flate (layoutRes, dette, attachToRoot)
Så i stedet for å skrive følgende:
val view = LayoutInflater .fra (foreldre) .flate (R.layout.activity_main, foreldre, falsk)
Du kan bare bruke din utvidelsesfunksjon:
val view = parent.inflate (R.layout.activity_main)
I Java har opprettelsen av singletoner vanligvis vært ganske ordentlig, og krever at du oppretter en klasse med en privat konstruktør og deretter oppretter den som en privat attributt.
Sluttresultatet er vanligvis noe slikt:
offentlig klasse Singleton privat statisk Singleton singleton = new Singleton (); privat Singleton () offentlig statisk Singleton getInstance () return singleton;
I stedet for å erklære en klasse, lar Kotlin deg definere et enkelt objekt, som er semantisk det samme som en singleton, i en linje med kode:
objekt KotlinSingleton
Du kan da bruke denne singleton med en gang, for eksempel:
objekt KotlinSingleton morsom myFunction () [...] KotlinSingleton.myFunction ()
I denne artikkelen tok vi en grundig titt på Kotlins null sikker design og så hvordan du kan sikre at Android-prosjekter forblir null sikre, selv når de inneholder en blanding av Java og Kotlin-koden ved å bruke en rekke spesialoperatører. Vi tok også en titt på hvordan du kan bruke lambda-uttrykk for å forenkle noen vanlige utviklingsoppgaver i Android, og hvordan du legger til ny funksjonalitet i eksisterende klasser.
Kombinert med det vi lærte i del 1: Java vs Kotlin og Del 2: Komme i gang har du nå alt du trenger for å begynne å bygge effektive Android-apper ved hjelp av Kotlins programmeringsspråk.
Ha det gøy med Kotlin-språket, og hvorfor ikke sjekk ut noen av våre andre kurs og opplæringsprogrammer på Android-programmering?