Uitgebreide gids voor nulveiligheid in Kotlin

1. Overzicht

In dit artikel zullen we kijken naar de null-veiligheidsfuncties die in de Kotlin-taal zijn ingebouwd. Kotlin biedt uitgebreide, native afhandeling van nullable velden - er zijn geen extra bibliotheken nodig.

2. Maven Afhankelijkheid

Om te beginnen, moet u het kotlin-stdlib Maven afhankelijkheid van uw pom.xml:

 org.jetbrains.kotlin kotlin-stdlib 1.1.1 

U kunt de nieuwste versie vinden op Maven Central.

3. Nullable en niet-Nullable Reference Types

Kotlin heeft twee soorten referenties die worden geïnterpreteerd door de compiler om de programmeur informatie te geven over de juistheid van een programma tijdens het compileren - degenen die nullabel zijn en degenen die dat niet zijn.

Standaard gaat Kotlin ervan uit dat de waarde niet kan zijn nul:

var a: String = "waarde" assertEquals (a.length, 5)

We kunnen niet toewijzen nul naar de referentie een, en als u het probeert, zal dit een compilatiefout veroorzaken.

Als we een nullable-referentie willen maken, moeten we het vraagteken (?) Aan de typedefinitie toevoegen:

var b: String? = "waarde"

Daarna kunnen we toewijzen nul naar het:

b = nul

Wanneer we toegang willen krijgen tot het b referentie, we moeten de nul geval expliciet om een ​​compilatiefout te vermijden, omdat Kotlin weet dat deze variabele kan bevatten nul:

if (b! = null) {println (b.length)} anders {assertNull (b)}

4. Veilige oproepen

Het op deze manier behandelen van elke nulbare referentie kan omslachtig zijn. Gelukkig heeft Kotlin een syntaxis voor "veilige oproepen" - deze syntaxis stelt programmeurs in staat voer een actie alleen uit als de specifieke verwijzing een niet-nulwaarde bevat.

Laten we twee dataklassen definiëren om deze functie te illustreren:

dataklasse Persoon (val land: Land?) Dataklasse Land (valcode: String?)

Merk op dat de land en code velden hebben een nullabel referentietype.

Om op een vloeiende manier toegang te krijgen tot die velden, kunnen we de veilige oproep-syntaxis gebruiken:

val p: Persoon? = Persoon (Land ("ENG")) val res = p? .Country? .Code assertEquals (res, "ENG")

Moet de variabele p vasthouden nul, zal de syntaxis van veilige oproepen een nul resultaat:

val p: Persoon? = Persoon (Land (null)) val res = p? .Land? .Code assertNull (res)

4.1. De let () methode

Om een ​​actie alleen uit te voeren als een referentie een niet-nulbare waarde bevat, kunnen we een laat operator.

Laten we zeggen dat we een lijst met waarden hebben en er is ook een nul waarde in die lijst:

val firstName = "Tom" val secondName = "Michael" valnamen: List = listOf (firstName, null, secondName)

Vervolgens kunnen we een actie uitvoeren op elk niet-nulbaar element van het namen lijst met behulp van een laat functie:

var res = listOf () voor (item in namen) {item? .let {res = res.plus (it)}} assertEquals (2, res.size) assertTrue {res.contains (firstName)} assertTrue {res.contains (tweede naam) }

4.2. De also () methode

Als we willen om een ​​extra bewerking toe te passen, bijvoorbeeld inloggen op elke niet-nulbare waarde die we kunnen gebruiken een ook()methode en keten het met een laat():

var res = listOf () voor (item in namen) {item? .let {res = res.plus (it); it}? .also {it -> println ("non nullable value: $ it")}}

Het zal elk element afdrukken dat niet nul is:

waarde zonder nulwaarde: Tom waarde zonder nulwaarde: Michael

4.3. De run () methode

Kotlin heeft een rennen() methode om een ​​bewerking uit te voeren op een nullable referentie. Het lijkt erg op laat() maar binnen de body van een functie, The Run () Method werkt op dit verwijzing in plaats van een functieparameter:

var res = listOf () voor (item in namen) {item? .run {res = res.plus (this)}}

5. Elvis-operator

Soms, als we een referentie hebben, willen we een standaardwaarde van de bewerking retourneren als de referentie een nul. Om dat te bereiken, kunnen we een Elvis (?:) operator. Dit is een equivalent van orElse / ofElseGet van Java Optioneel klasse:

val waarde: String? = null val res = waarde? .length?: -1 assertEquals (res, -1)

Wanneer de waarde reference bevat een niet-nulbare waarde, de method lengte zal worden aangeroepen:

val waarde: String? = "naam" val res = waarde? .length?: -1 assertEquals (res, 4)

6. Nullable onveilige Get

Kotlin heeft ook een onveilige operator om een ​​waarde van een nullabel veld te krijgen zonder expliciet om te gaan met afwezigheidslogica, maar het moet zeer zorgvuldig worden gebruikt.

De operator voor dubbel uitroepteken (!!) neemt een waarde van een nullable referentie en gooit een NullPointerException als het zo is nul. Dit is een equivalent van Optioneel.get () operatie:

var b: String? = "waarde" b = null assertFailsWith {b !! }

Als de nullable-referentie een niet-nullable-waarde bevat, wordt de actie op die waarde met succes uitgevoerd:

val b: String? = "waarde" assertEquals (b !!. lengte, 5)

7. Null-waarden uit een lijst filteren

De Lijst klasse in Kotlin heeft een hulpprogramma-methode filterNotNull () die alleen niet-nullable waarden retourneert uit een lijst die nullable referenties bevat:

val list: List = listOf ("a", null, "b") val res = list.filterNotNull () assertEquals (res.size, 2) assertTrue {res.contains ("a")} assertTrue {res.contains ( "b")}

Dit is een zeer nuttige constructie die de logica omvat die we anders zelf zouden moeten implementeren.

8. Conclusie

In dit artikel hebben we de null-veiligheidsfuncties van Koltin grondig onderzocht. We hebben soorten referenties gezien die kunnen kloppen nul waarden en degenen die dat niet kunnen. We hebben vloeiend geïmplementeerd nul logica afhandelen door gebruik te maken van "veilige oproep" -functies en de Elvis operator.

De implementatie van al deze voorbeelden en codefragmenten is te vinden in het GitHub-project - dit is een Maven-project, dus het moet gemakkelijk te importeren en uit te voeren zijn zoals het is.


$config[zx-auto] not found$config[zx-overlay] not found