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.