Droši zvani (?) Vs Null pārbaudes (!!) Kotlīnā

Kotlīnā tipu sistēma izšķir atsauces, kurās var būt nulles (atsauces ar nulli) un tām, kuras nevar būt (atsauces, kas nav nulles).
Piemēram, parastam īpašumam nevar būt nulles vērtība un tiks parādīta kompilācijas kļūda.

var mainīgais: CustomClass = CustomClass ()
mainīgais = null // kompilācijas kļūda

Tā vietā mēs varam pievienot? aiz šī īpašuma datu veida, kas šo mainīgo deklarē kā neatņemamu īpašumu

var nullableVariable: CustomClass? = CustomClass ()
nullableVariable = null // darbojas labi

Jebkurā gadījumā neatceļamajam īpašumam katru reizi pirms šī īpašuma izmantošanas ir nepieciešama nulles pārbaude vai arī izstrādātājam ir jāapstiprina, ka šī īpašuma aprēķins tā izmantošanas laikā nebūs spēkā esošs.

varia.someMethodCall () // darbojas labi, jo kompilators ir pārliecināts, ka
                          // mainīgais nevar būt nulle
nullableVariable.someMethodCall () // izcels kompilācijas kļūdu
                                  // kā kompilators nav pārliecināts kā
                                  // nullVariable var būt nulle.

Joprojām ir maz paņēmienu, kā izmantot vai piekļūt mainīgajam mainīgajam. Viens no tiem ir drošs zvans ?. un vēl viens ir null check !! bet pirms noskaidrot atšķirību starp abiem, vispirms sapratīsim, kas tās ir par detaļām.

Nepārprotama nulles pārbaude
Šis ir vecais raksts, kuru mēs izmantojam visās citās valodās, pārbaudot mainīgo, vai tā nav vai nav.

if (null! = nullableVariable) {
 nullableVariable.someMethodCall ()
} cits {
 // rezerves plūsma
}

Ņemiet vērā šo ekskluzīvo darbu, kur “nullableVariable” nav mainīgs (ti, vietējs īpašums, kuru nevar mainīt starp pārbaudi un izmantošanu, vai loceklis “val”, kuram ir pamatlauks un kurš nav pārmērīgs), citādi var gadīties, ka “ nullableVariable ”pēc pārbaudes mainās uz null.
Ja tas ir mainīgs īpašums, tieša nulles pārbaude nedarbosies, un kompilators parādīs zemāk redzamo kompilācijas kļūdu.

Viedā pārvade uz “CustomClass” nav iespējama, jo “nullableVariable” ir mainīgs īpašums, kuru līdz šim laikam varēja mainīt.

Droši zvani (?)
Vēl viens veids, kā izmantot neatceļamu īpašumu, ir drošs zvana operators ?.
Šī metode tiek izsaukta, ja īpašums nav nulle, vai atgriež nulli, ja šis īpašums ir nulle, neizmetot NPE (nulles rādītāja izņēmums).

nullableVariable? .someMethodCall ()

Droši zvani ir noderīgi ķēdēs. Piemēram, ja Bobs, Darbinieks, var tikt norīkots uz nodaļu (vai ne), kurai savukārt nodaļas darbinieks var būt cits darbinieks, tad, lai iegūtu Boba nodaļas vadītāja vārdu (ja tāds ir), mēs rakstām sekojošo:

bobs? .dalījums? .galva? .vārds

Šāda ķēde atgriež nulli, ja kāda no tās īpašībām nav spēkā.

Lai noteiktu darbību veiktu tikai ar vērtībām, kas nav nulles, varat izmantot drošā zvana operatoru kopā ar let

val listWithNulls: saraksts  = listOf (“A”, null)
priekš (prece sarakstāWithNulls) {
 prece? .let {println (it)} // izdrukā A un ignorē nulli
}

Elvisa operators (? :)
Šis ir līdzīgs drošiem zvaniem, izņemot to, ka tas var atgriezt nulles vērtību, ja zvana īpašums ir nulle

val rezultāts = nullableVariable? .someMethodCall ()
                       ?: fallbackIfNullMethodCall ()

Operators Elvis novērtēs kreiso izteiksmi un atgriezīs to, ja tā nav nulles vērtējuma izteiksme labajā pusē. Lūdzu, ņemiet vērā, ka labās puses izteiksme tiks izsaukta tikai tad, ja izteiksme kreisajā pusē ir nulle.

Ņemiet vērā: tā kā metiens un atgriešanās ir Kotlinā izteikti vārdi, tos var izmantot arī Elvisa operatora labajā pusē. Tas var būt ļoti noderīgi, piemēram, funkciju argumentu pārbaudei

fun foo (mezgls: mezgls): stīga? {
 val parent = node.getParent () ?: atgriezt null
 val name = node.getName ()?: mest IllegalArgumentException (“name gaidīts”)
 //…
}

!! Operators
Šis operators tiek izmantots, lai kompilētājam skaidri pateiktu, ka īpašums nav nulle, un, ja tas ir nulle, lūdzu, atmetiet nulles rādītāja izņēmumu (NPE)

nullableVariable !!. someMethodCall ()

šis kods darbosies labi, ja “nullableVariable” nav nulle, tas iemetīs NPE.

Pamata atšķirība, lietojot ?. un !! ir, ja vēlaties nodalīt parasto mainīgā īpašuma plūsmu ar vērtību “nulle” ar “nulles” vērtības plūsmas izmantošanu ?.

Bet, ja esat pārliecināts, ka var īpašuma vērtība nav nulles vērtība !! tā vietā ?.
Arī ?. var izmantot, lai atgrieztos vai izmestu cita veida izņēmumus, bet !! metīs tikai NPE.

Tas pagaidām ir viss. Šeit varat lasīt citas manas interesantas ziņas vai arī izbaudīt manis šeit uzskaitītās spēles vai lietotnes. Šeit uzskaitītajā lietotnē jūtieties brīvi izmantot manus atvērtā pirmkoda Android komponentus. Vai arī nometiet e-pastu, ja neatradāt meklēto un jums nepieciešama palīdzība.

Atsauce: Kotlin docs