Omfattende guide til null sikkerhet i Kotlin
1. Oversikt
I denne artikkelen ser vi på null sikkerhetsfunksjoner innebygd i Kotlin-språket. Kotlin tilbyr omfattende, innfødt håndtering av nullbare felt - ingen ekstra biblioteker er nødvendige.
2. Maven avhengighet
For å komme i gang, må du legge til kotlin-stdlib Maven avhengighet til din pom.xml:
org.jetbrains.kotlin kotlin-stdlib 1.1.1
Du finner den nyeste versjonen på Maven Central.
3. Nullable og Non-Nullable Reference Types
Kotlin har to typer referanser som tolkes av kompilatoren for å gi programmereren informasjon om korrektheten til et program på kompileringstidspunktet - de som er ugyldige og de som ikke er.
Som standard antar Kotlin at verdien ikke kan være null:
var a: String = "value" assertEquals (a.length, 5)
Vi kan ikke tildele null til referansen en, og hvis du prøver å gjøre det, vil det føre til en kompilatorfeil.
Hvis vi vil lage en nullbar referanse, må vi opprette legge til spørsmålstegnet (?) Til typedefinisjonen:
var b: String? = "verdi"
Etter det kan vi tildele null til det:
b = null
Når vi ønsker å få tilgang til b referanse, må vi håndtere null saken eksplisitt for å unngå en kompileringsfeil fordi Kotlin vet at denne variabelen kan holde null:
hvis (b! = null) {println (b.length)} else {assertNull (b)}
4. Trygge samtaler
Å håndtere alle nullaktive referanser på en slik måte kan være tungvint. Heldigvis har Kotlin en syntaks for "sikre samtaler" - denne syntaksen tillater programmerere å utfør en handling bare når den spesifikke referansen har en ikke-null verdi.
La oss definere to dataklasser for å illustrere denne funksjonen:
dataklasse Person (val land: Land?) dataklasse Land (val kode: String?)
Merk at land og kode felt er av nullbar referansetype.
For å få tilgang til disse feltene på en flytende måte, kan vi bruke syntaksen for sikker samtale:
val p: Person? = Person (Country ("ENG")) val res = p? .Country? .Code assertEquals (res, "ENG")
Bør variabelen s holde en nullvil syntaksen for trygge samtaler returnere a null resultat:
val p: Person? = Person (Land (null)) val res = p? .Land?. Kode assertNull (res)
4.1. La () -metoden
For å utføre en handling bare når en referanse har en ikke-nullbar verdi, kan vi bruke a la operatør.
La oss si at vi har en liste over verdier, og det er også en null verdi i den listen:
val firstName = "Tom" val secondName = "Michael" val names: List = listOf (firstName, null, secondName)
Deretter kan vi utføre en handling på alle ikke-nullbare elementer i navn listen ved å bruke en la funksjon:
var res = listOf () for (element i navn) {item? .let {res = res.plus (it)}} assertEquals (2, res.size) assertTrue {res.contains (firstName)} assertTrue {res.contains (secondName)}
4.2. Også () -metoden
Hvis vi vil for å bruke noen ekstra operasjoner, for eksempel å logge på alle ikke-nullverdier vi kan bruke en også()metode og lenke den med en la():
var res = listOf () for (item in names) {item? .let {res = res.plus (it); det}?. også {it -> println ("ikke nullbar verdi: $ it")}}
Det vil skrive ut hvert element som ikke er null:
ikke nullbar verdi: Tom ikke null verdi: Michael
4.3. Kjør () -metoden
Kotlin har en løpe() metode for å utføre noen operasjoner på en nullbar referanse. Det er veldig likt la() men inne i en funksjonsdel, The Run () -metoden opererer videre dette referanse i stedet for en funksjonsparameter:
var res = listOf () for (element i navn) {item? .run {res = res.plus (dette)}}
5. Elvis-operatør
Noen ganger, når vi har en referanse, vil vi returnere en standardverdi fra operasjonen hvis referansen har en null. For å oppnå det kan vi bruke en elvis (?:) operatør. Dette tilsvarer orElse / orElseGet fra Java Valgfri klasse:
val verdi: Streng? = null val res = verdi? .lengde?: -1 assertEquals (res, -1)
Når verdi referanse har en ikke-nullbar verdi, metoden lengde vil bli påkalt:
val verdi: Streng? = "navn" val res = verdi? .lengde?: -1 assertEquals (res, 4)
6. Nullable Usikker Get
Kotlin har også en usikker operatør for å få en verdi av et nullbart felt uten å håndtere fraværslogikk eksplisitt, men det bør brukes veldig nøye.
Dobbelt utropstegnoperatør (!!) tar en verdi fra en nullbar referanse og kaster a NullPointerException hvis det holder null. Dette tilsvarer Valgfritt.get () operasjon:
var b: String? = "verdi" b = null assertFailsMed {b !! }
Hvis den nullbare referansen har en ikke-nullbar verdi, vil handlingen på den verdien bli utført:
val b: Streng? = "value" assertEquals (b !!. lengde, 5)
7. Filtrering av nullverdier fra en liste
De Liste klasse i Kotlin har en verktøymetode filterNotNull () som bare returnerer ikke-nullverdier fra en liste som inneholder nullbare referanser:
val-liste: List = listOf ("a", null, "b") val res = list.filterNotNull () assertEquals (res.size, 2) assertTrue {res.contains ("a")} assertTrue {res.contains ( "b")}
Dette er en veldig nyttig konstruksjon som innkapsler logikken som vi ellers ville trengt å implementere selv.
8. Konklusjon
I denne artikkelen undersøkte vi Koltins null sikkerhetsfunksjoner i dybden. Vi så typer referanser som kan holde null verdier og de som ikke kan. Vi implementerte flytende null håndtering av logikk ved å bruke funksjonene "safe call" og elvis operatør.
Implementeringen av alle disse eksemplene og kodebitene finnes i GitHub-prosjektet - dette er et Maven-prosjekt, så det skal være enkelt å importere og kjøre som det er.