Á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.