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.


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