Omfattende guide til nul sikkerhed i Kotlin

1. Oversigt

I denne artikel ser vi på de nul-sikkerhedsfunktioner, der er indbygget i Kotlin-sproget. Kotlin tilbyder omfattende, indfødt håndtering af ugyldige felter - der er ikke behov for yderligere biblioteker.

2. Maven-afhængighed

For at komme i gang skal du tilføje kotlin-stdlib Maven afhængighed af din pom.xml:

 org.jetbrains.kotlin kotlin-stdlib 1.1.1 

Du kan finde den nyeste version på Maven Central.

3. Nullable og Non-Nullable Reference Types

Kotlin har to typer referencer der fortolkes af kompilatoren for at give programmøren information om rigtigheden af ​​et program på kompileringstidspunktet - dem der er ugyldige og dem der ikke er.

Som standard antager Kotlin, at værdien ikke kan være nul:

var a: String = "value" assertEquals (a.length, 5)

Vi kan ikke tildele nul til referencen -en, og hvis du prøver, vil det medføre en compiler-fejl.

Hvis vi vil oprette en ugyldig reference, skal vi oprette tilføje spørgsmålstegnet (?) Til typedefinitionen:

var b: String? = "værdi"

Derefter kan vi tildele nul til det:

b = null

Når vi ønsker at få adgang til b reference, vi skal håndtere nul sag eksplicit for at undgå en kompileringsfejl, fordi Kotlin ved, at denne variabel kan holde nul:

hvis (b! = null) {println (b.length)} ellers {assertNull (b)}

4. Sikre opkald

Håndtering af enhver ugyldig reference på en sådan måde kan være besværlig. Heldigvis har Kotlin en syntaks til "sikre opkald" - denne syntaks tillader programmører at udfør kun en handling, når den specifikke reference har en ikke-nul-værdi.

Lad os definere to dataklasser for at illustrere denne funktion:

dataklasse Person (val land: Land?) dataklasse Land (val kode: String?)

Bemærk, at Land og kode felter er af nullabel referencetype.

For at få adgang til disse felter på en flydende måde kan vi bruge den sikre opkaldssyntaks:

val p: Person? = Person (land ("ENG")) val res = p? .Country? .Code assertEquals (res, "ENG")

Skulle variablen s hold en nul, vil syntaks for sikre opkald returnere a nul resultat:

val p: Person? = Person (land (null)) val res = p? .Land?. Kode assertNull (res)

4.1. Let () -metoden

For at kun udføre en handling, når en reference har en ikke-ugyldig værdi, kan vi bruge en lade operatør.

Lad os sige, at vi har en liste over værdier, og at der også er en nul værdi på denne liste:

val firstName = "Tom" val secondName = "Michael" val names: List = listOf (firstName, null, secondName)

Dernæst kan vi udføre en handling på ethvert ikke-ugyldigt element i navne liste ved hjælp af en lade fungere:

var res = listOf () for (item in names) {item? .let {res = res.plus (it)}} assertEquals (2, res.størrelse) assertTrue {res.contains (firstName)} assertTrue {res.contains (efternavn) }

4.2. Metoden also ()

Hvis vi vil for at anvende yderligere operationer, f.eks. logge på hver ikke-ugyldig værdi, vi kan bruge en også()metode og kæde den med en lade():

var res = listOf () for (element i navne) {item? .let {res = res.plus (it); det}?. også {it -> println ("ikke ugyldig værdi: $ it")}}

Det udskriver hvert element, der ikke er nul:

ikke-ugyldig værdi: Tom ikke-ugyldig værdi: Michael

4.3. Kør () -metoden

Kotlin har en løb() metode til at udføre nogle operationer på en ugyldig reference. Det ligner meget på lade() men inde i et funktionsorgan, The Run () -metoden fungerer på det her reference i stedet for en funktionsparameter:

var res = listOf () for (element i navne) {item? .run {res = res.plus (dette)}}

5. Elvis-operatør

Nogle gange, når vi har en reference, vil vi returnere en standardværdi fra operationen, hvis referencen indeholder en nul. For at opnå det kan vi bruge en elvis (?:) operatør. Dette svarer til ellerElse / ellerElseGet fra Java Valgfri klasse:

val værdi: String? = null val res = værdi? .længde?: -1 assertEquals (res, -1)

Når værdi reference har en ikke-ugyldig værdi, metoden længde vil blive påberåbt:

val værdi: String? = "navn" val res = værdi? .længde?: -1 assertEquals (res, 4)

6. Udeladelig usikker Get

Kotlin har også en usikker operatør til at få en værdi af et ugyldigt felt uden eksplicit at håndtere fraværslogik, men det skal bruges meget omhyggeligt.

Operatoren med dobbelt udråbstegn (!!) tager en værdi fra en ugyldig reference og kaster en NullPointerException hvis det holder nul. Dette svarer til Valgfri.get () operation:

var b: String? = "værdi" b = null assertFailsWith {b !! }

Hvis den nullable reference har en ikke-nullable værdi, udføres handlingen på den værdi med succes:

val b: String? = "værdi" assertEquals (b !!. længde, 5)

7. Filtrering af nulværdier fra en liste

Det Liste klasse i Kotlin har en hjælpemetode filterNotNull () der kun returnerer ikke-ugyldige værdier fra en liste, der indeholder ugyldige referencer:

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 meget nyttig konstruktion, der indkapsler den logik, som vi ellers ville have brug for at implementere selv.

8. Konklusion

I denne artikel udforskede vi Koltins nul-sikkerhedsfunktioner i dybden. Vi så typer referencer, der kan indeholde nul værdier og dem, der ikke kan. Vi implementerede flydende nul håndtering af logik ved hjælp af “sikre opkald” -funktioner og elvis operatør.

Implementeringen af ​​alle disse eksempler og kodestykker findes i GitHub-projektet - dette er et Maven-projekt, så det skal være let at importere og køre, som det er.