Ohutud kõned (?) Vs Null kontrollid (!!) Kotlinis

Kotlini puhul eristab tüübisüsteem viiteid, millel võib olla null (tühised viited), ja neid, mis ei saa (nullist mitteolevaid viiteid).
Näiteks ei saa tavalisel omadusel olla nullväärtust ja see näitab kompileerimisviga.

var muutuja: CustomClass = CustomClass ()
muutuja = null // kompileerimisviga

Selle asemel võime lisada? pärast selle omaduse andmetüüpi, mis kuulutab selle muutuja lahutamatuks omaduseks

var nullableVariable: CustomClass? = CustomClass ()
nullableVariable = null // töötab hästi

Igal juhul nõuab tühistatav vara enne selle vara kasutamist iga kord nullkontrolli või nõuab arendajalt kinnitust, et selle vara hinnang ei saa selle kasutamise ajal olematu

muutuja.someMethodCall () // töötab hästi, kuna kompilaator on selles kindel
                          // muutuja ei saa olla null
nullableVariable.someMethodCall () // toob esile kompileerimisvea
                                  // kompilaatorina pole kindel
                                  // nullVariable võib olla null.

Nullable muutuja kasutamiseks või sellele juurde pääsemiseks on veel vähe tehnikaid. Üks neist on turvaline kõne ?. ja veel üks on null check !! kuid enne, kui mõistate mõlema erinevust, mõelgem kõigepealt, millised need on.

Selge nullkontroll
See on vana muster, mida kasutame igas muus keeles, kontrollides muutujat, kas see on null või mitte.

if (null! = nullableVariable) {
 nullableVariable.someMethodCall ()
} veel {
 // varuvool
}

Pange tähele seda eksklusiivset teost, kus 'nullableVariable' on muutumatu (st kohalik omadus, mida ei saa tšeki ja kasutamise vahel muuta, või liige 'val', millel on tagaväli ja mis pole ületamatu), muidu võib juhtuda, et ' nullableVariable 'muutub pärast kontrollimist nulliks.
Kui see on muudetav omadus, siis sõnaselge nullkontroll ei toimi ja kompilaator näitab allpool olevat kompileerimisviga.

Tarkvara ülekandmine kohandatud klassiCC on võimatu, kuna „nullableVariable” on muutuv omadus, mida oleks saanud selleks ajaks muuta.

Ohutud kõned (?.)
Teine viis tühja omaduse kasutamiseks on turvaline kõneoperaator ?.
See kutsub meetodit, kui atribuut ei ole null, või tagastab null, kui see atribuut on null ilma NPE-d visata (nullkursori erand).

nullableVariable? .someMethodCall ()

Turvalistest kõnedest on kasu ahelates. Näiteks kui töötaja Bobi võidakse määrata osakonda (või mitte), kus osakonnajuhatajaks võib olla omakorda teine ​​töötaja, kirjutame Bobi osakonnajuhataja (kui see on olemas) nime saamiseks järgmise

bob? .osakond? .pea? .nimi

Selline ahel tagastab olematu, kui mõni selle omadustest on null.

Teatud toimingu tegemiseks ainult nullväärtuste korral võite kasutada turvalise kõne operaatorit koos lubamisega

val listWithNulls: Loend  = listOf (“A”, null)
jaoks (element listWithNulls'is) {
 üksus? .let {println (it)} // prindib A ja ignoreerib nulli
}

Elvise operaator (? :)
See sarnaneb turvaliste kõnedega, välja arvatud see, et see võib tagastada mitteväärtusliku väärtuse, kui helistava atribuudi väärtus on null

val tulemus = nullableVariable? .someMethodCall ()
                       ?: fallbackIfNullMethodCall ()

Elvise operaator hindab vasakpoolset avaldist ja tagastab selle, kui see pole null, hindab parempoolne avaldis. Pange tähele, et parempoolset avaldist kutsutakse ainult siis, kui vasakpoolne avaldis on null.

Pange tähele, et kuna viskamine ja tagasitulek on Kotlinis väljendeid, saab neid kasutada ka Elvise paremal küljel. See võib olla väga mugav näiteks funktsiooniargumentide kontrollimiseks

fun foo (sõlm: sõlm): keelpill? {
 val vanem = node.getParent ()?: tagasta null
 val name = node.getName ()?: viska IllegalArgumentException (“name oodatakse”)
 //…
}

! Operaator
Seda operaatorit kasutatakse kompilaatorile selgesõnaliselt ütlema, et atribuut pole null ja kui see on null, siis visake nullkursori erand (NPE)

nullableVariable !!. someMethodCall ()

see kood töötab hästi, kui „nullableVariable” pole tühine, vastasel juhul viskab see NPE-d.

Põhiline erinevus kasutamise ajal ?. ja !! on see, kas soovite eraldada tavalise muutujata omaduse voo, millel on nullväärtus, väärtuse voo kasutamise korral null?

Aga kui olete kindel, et var vara väärtus ei ole tühine kasutamine !! selle asemel ?.
Samuti ?. saab kasutada teistsuguste erandite tagastamiseks või viskamiseks, kuid !! viskab ainult NPE-d.

Praeguseks kõik. Minu muid huvitavaid postitusi saate lugeda siit või võite nautida minu siin loetletud mänge või rakendusi. Kasutage siin loetletud rakenduses julgelt minu avatud lähtekoodiga Androidi komponente. Või loobuge meilisõnumist, kui te ei leidnud otsitavat ja vajate abi.

Viide: Kotlini dokumendid