Sveobuhvatan vodič za nulu sigurnost u Kotlinu

1. Pregled

U ovom ćemo članku razmotriti null sigurnosne značajke ugrađene u jezik Kotlin. Kotlin pruža sveobuhvatno, izvorno rukovanje s poništljivim poljima - nisu potrebne dodatne knjižnice.

2. Ovisnost Mavena

Da biste započeli, morat ćete dodati kotlin-stdlib Mavenova ovisnost o vašem pom.xml:

 org.jetbrains.kotlin kotlin-stdlib 1.1.1 

Najnoviju verziju možete pronaći na Maven Central.

3. Referentne vrste koje se mogu poništiti i ne poništiti

Kotlin ima dvije vrste referenci koje interpretator tumači kako bi programeru dao informacije o ispravnosti programa u vrijeme sastavljanja - one koje su null i one koje nisu.

Prema zadanim postavkama Kotlin pretpostavlja da vrijednost ne može biti null:

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

Ne možemo dodijeliti null na referencu a, a ako pokušate, to će uzrokovati pogrešku kompajlera.

Ako želimo stvoriti poništivu referencu, moramo stvoriti dodati upitnik (?) Definiciji tipa:

var b: Niz? = "vrijednost"

Nakon toga možemo dodijeliti null tome:

b = nula

Kada želimo pristupiti b referencu, moramo se nositi s null slučaj izričito kako bi se izbjegla pogreška u kompilaciji jer Kotlin zna da ova varijabla može sadržavati null:

if (b! = null) {println (b.length)} else {assertNull (b)}

4. Sigurni pozivi

Rukovanje svakom poništavajućom referencom na takav način moglo bi biti glomazno. Srećom, Kotlin ima sintaksu za "sigurne pozive" - ​​ova sintaksa omogućava programerima izvršiti akciju samo kada određena referenca sadrži ne-null vrijednost.

Definirajmo dvije klase podataka kako bismo ilustrirali ovu značajku:

klasa podataka Osoba (val država: Zemlja?) klasa podataka Država (val kôd: Niz?)

Imajte na umu da zemlja i kodirati polja su nullabilnog referentnog tipa.

Za pristup tim poljima na tečan način možemo koristiti sintaksu sigurnog poziva:

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

Treba li varijabla str držite a null, sintaksa sigurnih poziva vratit će a null proizlaziti:

val p: Osoba? = Osoba (država (null)) val res = p? .Country? .Code assertNull (res)

4.1. Metoda let ()

Da bismo izvršili akciju samo kada referenca sadrži vrijednost koja se ne može poništiti, možemo koristiti neka operater.

Recimo da imamo popis vrijednosti, a postoji i null vrijednost na tom popisu:

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

Dalje, možemo izvršiti akciju na svakom ne poništavajućem elementu imena popis pomoću a neka funkcija:

var res = listOf () for (item in names) {item? .let {res = res.plus (it)}} assertEquals (2, res.size) assertTrue {res.contains (firstName)} assertTrue {res.contains (Drugi naziv) }

4.2. Metoda also ()

Ako želimo primijeniti neku dodatnu operaciju, na primjer bilježenje svake vrijednosti koja se ne može poništiti, a koju možemo koristiti također()metodu i povezati s a neka ():

var res = listOf () for (stavka u imenima) {item? .let {res = res.plus (it); it}?. također {it -> println ("vrijednost koja se ne može poništiti: $ it")}}

Ispisat će svaki element koji nije null:

non nullable value: Tom non nullable value: Michael

4.3. Metoda trčanja ()

Kotlin ima trčanje() metoda za izvršavanje neke operacije na poništivoj referenci. Vrlo je slično neka () ali unutar tijela funkcije, metoda Run () djeluje na ovaj referenca umjesto parametra funkcije:

var res = listOf () for (stavka u imenima) {item? .run {res = res.plus (this)}}

5. Elvis Operator

Ponekad, kada imamo referencu, želimo vratiti neku zadanu vrijednost iz operacije ako referenca sadrži null. Da bismo to postigli, možemo koristiti elvis (?:) operator. Ovo je ekvivalent orElse / iliElseGet s Jave Neobvezno razred:

vrijednost val: Niz? = null val res = vrijednost? .length?: -1 assertEquals (res, -1)

Kada vrijednost referenca sadrži vrijednost koja se ne može poništiti, metoda duljina bit će pozvano:

vrijednost val: Niz? = "name" val res = vrijednost? .length?: -1 assertEquals (res, 4)

6. Nullable nesigurno dobiti

Kotlin također ima nesigurnog operatora za dobivanje vrijednosti poništavajućeg polja bez izričitog rukovanja logikom odsutnosti, ali treba ga koristiti vrlo pažljivo.

Dvostruki uskličnik (!!) uzima vrijednost iz poništene reference i baca a NullPointerException ako drži null. Ovo je ekvivalent Neobvezno.get () operacija:

var b: Niz? = "value" b = null assertFailsWith {b !! }

Ako nullable referenca sadrži vrijednost koja se ne može poništiti, radnja na toj vrijednosti će se uspješno izvršiti:

val b: Niz? = "value" assertEquals (b !!. duljina, 5)

7. Filtriranje null vrijednosti s popisa

The Popis klasa u Kotlinu ima korisnu metodu filterNotNull () koji vraća samo vrijednosti koje se ne mogu poništiti s popisa koji sadrži poništene reference:

val lista: List = listOf ("a", null, "b") val res = list.filterNotNull () assertEquals (res.size, 2) assertTrue {res.contains ("a")} assertTrue {res.contains ( "b")}

Ovo je vrlo korisna konstrukcija koja obuhvaća logiku koju bismo inače trebali implementirati.

8. Zaključak

U ovom smo članku detaljno istražili Koltinove nule sigurnosne značajke. Vidjeli smo vrste referenci koje mogu sadržavati null vrijednosti i one koje ne mogu. Tečno smo implementirali null rukovanje logikom pomoću značajki "sigurnog poziva" i elvis operater.

Provedbu svih ovih primjera i isječaka koda možete pronaći u projektu GitHub - ovo je Maven projekt, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.