Komplexný sprievodca nulovou bezpečnosťou v Kotline

1. Prehľad

V tomto článku sa pozrieme na nulové bezpečnostné prvky zabudované do jazyka Kotlin. Kotlin poskytuje komplexné a natívne spracovanie polí s povolenou hodnotou Null - nie sú potrebné žiadne ďalšie knižnice.

2. Závislosť od Maven

Ak chcete začať, musíte pridať kotlin-stdlib Závislosť závislá od vašej pom.xml:

 org.jetbrains.kotlin kotlin-stdlib 1.1.1 

Najnovšiu verziu nájdete na serveri Maven Central.

3. Referenčné typy s povolenou hodnotou Null a s možnou hodnotou Null

Kotlin má dva typy referencií ktoré sú interpretované kompilátorom, aby poskytli programátorovi informácie o správnosti programu v čase kompilácie - tie, ktoré majú povolenú hodnotu null a ktoré nie.

Kotlin štandardne predpokladá, že hodnota nemôže byť nulový:

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

Nemôžeme priradiť nulový k referencii a, a ak sa o to pokúsite, spôsobí to chybu kompilátora.

Ak chceme vytvoriť referenčnú hodnotu s možnou hodnotou Null, musíme vytvoriť prílohu otáznika (?) K definícii typu:

var b: Reťazec? = "hodnota"

Potom môžeme priradiť nulový k tomu:

b = null

Keď chceme vstúpiť do b odkaz, musíme zvládnuť nulový prípad výslovne aby sa zabránilo chybe pri kompilácii, pretože Kotlin vie, že táto premenná môže obsahovať nulový:

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

4. Bezpečné volania

Zaobchádzanie s takýmto odkazom s možnou hodnotou Null na tento spôsob by mohlo byť ťažkopádne. Našťastie má Kotlin syntax pre „bezpečné volania“ - táto syntax umožňuje programátorom vykonať akciu, iba ak konkrétny odkaz obsahuje nenulovú hodnotu.

Na ilustráciu tejto funkcie definujeme dve dátové triedy:

dátová trieda Osoba (val krajina: Country?) dátová trieda Country (val val code: String?)

Všimnite si, že krajina a kód polia majú referenčný typ s možnou hodnotou null.

Na plynulý prístup k týmto poliam môžeme použiť syntax bezpečného hovoru:

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

Mala by premenná p držať a nulový, syntax bezpečných hovorov vráti a nulový výsledok:

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

4.1. Metóda let ()

Na vykonanie akcie iba v prípade, že referencia obsahuje hodnotu s nulovou hodnotou, môžeme použiť a nechajme operátor.

Povedzme, že máme zoznam hodnôt a existuje aj a nulový hodnota v tomto zozname:

val firstName = "Tom" val secondName = "Michael" názvy valcov: List = listOf (firstName, null, secondName)

Ďalej môžeme vykonať akciu na každom prvku, ktorý nemá hodnotu Null mien zoznam pomocou a nechajme funkcia:

var res = listOf () pre (položka v názvoch) {položka? .let {res = res.plus (it)}} assertEquals (2, res.size) assertTrue {res.contains (firstName)} assertTrue {res.contains (druhé meno) }

4.2. Metóda also ()

Ak chceme použiť nejaké ďalšie operácie, napríklad prihlásenie sa na každú hodnotu s nulovou hodnotou, ktorú môžeme použiť tiež ()metóda a pripútajte ju a let ():

var res = listOf () pre (položka v názvoch) {položka? .let {res = res.plus (it); it}? .also {it -> println ("hodnota bez hodnoty null: $ it")}}

Vytlačí každý prvok, ktorý nemá hodnotu null:

hodnota s nulovou hodnotou: Tom hodnota s nulovou hodnotou: Michael

4.3. Metóda run ()

Kotlin má run () metóda na vykonanie určitej operácie s povolenou hodnotou Null. Je to veľmi podobné nech () ale vo vnútri tela funkcie je metóda Run () operuje ďalej toto odkaz namiesto funkčného parametra:

var res = listOf () pre (položka v názvoch) {položka? .run {res = res.plus (toto)}}

5. Prevádzkovateľ Elvis

Niekedy, keď máme referenciu, chceme z operácie vrátiť nejakú predvolenú hodnotu, ak referencia obsahuje a nulový. Aby sme to dosiahli, môžeme použiť elvis (?:) operátor. Toto je ekvivalent orElse / aleboElseGet z Javy Voliteľné trieda:

hodnota valca: String? = null val res = hodnota? .length?: -1 assertEquals (res, -1)

Keď hodnotu referencia obsahuje hodnotu bez hodnoty null, metódu dĺžka bude vyvolané:

hodnota valca: String? = "name" val res = value? .lenght?: -1 assertEquals (res, 4)

6. Nullable Unsafe Get

Kotlin má tiež nebezpečný operátor na získanie hodnoty poľa s povolenou hodnotou Null bez výslovnej manipulácie s logikou absencie, mal by sa však používať veľmi opatrne.

Operátor dvojitého výkričníka (!!) vezme hodnotu z referencie s možnou hodnotou null a hodí a NullPointerException ak drží nulový. Toto je ekvivalent Optional.get () prevádzka:

var b: Reťazec? = "hodnota" b = null assertFailsWith {b !! }

Ak referencia s možnou hodnotou Null obsahuje hodnotu, ktorá nemá hodnotu NULA, akcia s touto hodnotou sa vykoná úspešne:

val b: Reťazec? = "hodnota" assertEquals (b !!. dĺžka, 5)

7. Filtrovanie nulových hodnôt zo zoznamu

The Zoznam triedy v Kotline má úžitkovú metódu filterNotNull () ktorý vracia iba hodnoty, ktoré nemajú povolenú hodnotu Null, zo zoznamu, ktorý obsahuje odkazy s povolenou hodnotou Null:

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

Toto je veľmi užitočný konštrukt, ktorý zapuzdruje logiku, ktorú by sme inak sami potrebovali implementovať.

8. Záver

V tomto článku sme do hĺbky preskúmali Koltinove nulové bezpečnostné prvky. Videli sme typy referencií, ktoré môžu obsahovať nulový hodnoty a tie, ktoré nemôžu. Implementovali sme plynule nulový vybavovanie logiky pomocou funkcií „bezpečného volania“ a elvis operátor.

Implementáciu všetkých týchto príkladov a útržkov kódu nájdete v projekte GitHub - jedná sa o projekt Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.