Átfogó útmutató a Nullbiztonságról Kotlinban
1. Áttekintés
Ebben a cikkben megvizsgáljuk a Kotlin nyelvébe beépített biztonsági funkciókat. A Kotlin a nullázhatatlan mezők átfogó, natív kezelését biztosítja - nincs szükség további könyvtárakra.
2. Maven-függőség
A kezdéshez hozzá kell adnia a kotlin-stdlib Maven függőség az öntől pom.xml:
org.jetbrains.kotlin kotlin-stdlib 1.1.1
A legújabb verziót a Maven Central oldalon találja.
3. Nem törölhető és nem törölhető referencia típusok
Kotlinnak kétféle referenciája van amelyeket a fordító úgy értelmez, hogy információt adjon a programozónak a program fordításkori helyességéről - azok, amelyek semmissé válnak, és amelyek nem.
Alapértelmezés szerint Kotlin feltételezi, hogy az érték nem lehet nulla:
var a: String = "érték" assertEquals (a.hossz, 5)
Nem rendelhetünk hozzá nulla hivatkozásra a, és ha megpróbálja, fordítói hibát okoz.
Ha nullázhatatlan referenciát akarunk létrehozni, létre kell hoznunk a kérdőjelet (?) A típusdefinícióhoz:
var b: Húr? = "érték"
Ezt követően kijelölhetjük nulla hozzá:
b = null
Amikor hozzá akarunk férni a b referenciát kell kezelnünk a nulla eset kifejezetten elkerülni a fordítási hibákat, mert Kotlin tudja, hogy ez a változó képes megtartani nulla:
if (b! = null) {println (b.hossz)} else {assertNull (b)}
4. Biztonságos hívások
Minden semmissé váló referencia ilyen kezelése nehézkes lehet. Szerencsére Kotlin rendelkezik a „biztonságos hívások” szintaxisával - ez a szintaxis lehetővé teszi a programozók számára csak akkor hajtson végre műveletet, ha a konkrét hivatkozás nem null értékű.
Határozzunk meg két adatosztályt ennek a szolgáltatásnak a szemléltetésére:
adatosztály Személy (val ország: Ország?) adat osztály Ország (val kód: Karakterlánc?)
Vegye figyelembe, hogy a ország és kód mezők érvénytelen hivatkozási típusúak.
Ha ezeket a mezőket folyékonyan akarjuk elérni, használhatjuk a biztonságos hívás szintaxist:
val p: Személy? = Személy (Ország ("ENG")) val res = p? .Ország?? Code assertEquals (res, "ENG")
Ha a változó o tarts egy nulla, a biztonságos hívások szintaxisa visszaadja a nulla eredmény:
val p: Személy? = Személy (Ország (null)) val res = p? .Ország? .Code assertNull (res)
4.1. A let () metódus
Csak akkor hajthatunk végre egy műveletet, ha egy hivatkozás nem nullázhatatlan értékkel rendelkezik, használhatjuk a hadd operátor.
Tegyük fel, hogy van értéklistánk, és van még egy nulla érték ebben a listában:
val firstName = "Tom" val secondName = "Michael" val names: List = listOf (firstName, null, secondName)
Ezután végrehajthatunk egy műveletet a nevek listát az a használatával hadd funkció:
var res = listOf () for (elem a nevekben) {item? .let {res = res.plus (it)}} assertEquals (2, res.size) assertTrue {res.contains (firstName)} assertTrue {res.contains (második név) }
4.2. A szintén () módszer
Ha akarjuk néhány további művelet végrehajtása, például naplózás minden nem nullázható értéken, amelyet használhatunk is()módszer és láncoljon egy let ():
var res = listOf () for (elem a nevekben) {item? .let {res = res.plus (it); it}?. is {it -> println ("nem érvénytelen érték: $ it")}}
Ki fog nyomtatni minden elemet, amely nem null:
nem nullázható érték: Tom nem nullázható érték: Michael
4.3. A run () metódus
Kotlinnak van egy fuss() metódus valamilyen művelet végrehajtására egy érvénytelen hivatkozáson. Nagyon hasonlít a let () de egy függvénytest belsejében a Run () módszer működik ez hivatkozás függvényparaméter helyett:
var res = listOf () for (elem a nevekben) {item? .run {res = res.plus (this)}}
5. Elvis Operator
Néha, ha van referenciánk, vissza akarunk adni valamilyen alapértelmezett értéket a műveletből, ha a referencia rendelkezik a-val nulla. Ennek eléréséhez használhatunk egy elvis (?:) operátor. Ez egyenértékű a vagyElse / orElseGet Java-ból Választható osztály:
val érték: Húr? = null val res = érték?. hosszúság?: -1 assertEquals (res, -1)
Amikor az érték A hivatkozás nem nullázhatatlan értéket tartalmaz, a metódust hossz hivatkozásra kerül:
val érték: Húr? = "név" val res = érték? .hossz?: -1 assertEquals (res, 4)
6. Nullable Unsafe Get
Kotlinnak is van egy nem biztonságos operátora, hogy egy nullázható mező értékét megkapja anélkül, hogy kifejezetten kezelné a hiányzási logikát, de nagyon óvatosan kell használni.
A kettős felkiáltójel operátor (!!) vesz egy értéket egy nullázhatatlan referenciából és dob egy a-t NullPointerException ha tart nulla. Ez egyenértékű a Opcionális.get () művelet:
var b: Húr? = "érték" b = null assertFailsWith {b !! }
Ha a nullázható hivatkozás nem nullázhatatlan értéket tartalmaz, akkor az adott művelet sikeresen végrehajtásra kerül:
val b: Húr? = "value" assertEquals (b !!. hossz, 5)
7. A nullértékek szűrése egy listáról
A Lista osztály Kotlinban van egy hasznossági módszere filterNotNull () amely csak nem nullázhatatlan értékeket ad vissza egy listából, amely érvénytelen hivatkozásokat tartalmaz:
val list: List = listOf ("a", null, "b") val res = list.filterNotNull () assertEquals (res.size, 2) assertTrue {res.contains ("a")} assertTrue {res.contains ( "b")}
Ez egy nagyon hasznos konstrukció, amely magában foglalja azt a logikát, amelyre egyébként magunkra lenne szükségünk.
8. Következtetés
Ebben a cikkben alaposan megvizsgáltuk Koltin semmilyen biztonsági funkcióját. Láttunk olyan típusú referenciákat, amelyek megtartják nulla értékek és azok, amelyek nem tudnak. Folyékonyan hajtottuk végre nulla a logika kezelése a „biztonságos hívás” funkciók és a elvis operátor.
Ezeknek a példáknak és kódrészleteknek a megvalósítása megtalálható a GitHub projektben - ez egy Maven projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.