Umfassender Leitfaden zur Null-Sicherheit in Kotlin

Umfassender Leitfaden zur Nullsicherheit in Kotlin

1. Überblick

In diesem Artikel werden die in die Kotlin-Sprache integrierten Null-Sicherheitsfunktionen behandelt. Kotlin bietet eine umfassende, systemeigene Handhabung von nullbaren Feldern - es werden keine zusätzlichen Bibliotheken benötigt.

2. Maven-Abhängigkeit

Um zu beginnen, müssen Sie diekotlin-stdlib Maven-Abhängigkeit zu Ihrenpom.xml: hinzufügen


    org.jetbrains.kotlin
    kotlin-stdlib
    1.1.1

Sie finden die neueste Version aufMaven Central.

3. Nullable und Non-Nullable Referenztypen

Kotlin has two types of references, die vom Compiler interpretiert werden, um dem Programmierer Informationen über die Richtigkeit eines Programms zur Kompilierungszeit zu geben - solche, die nullbar sind und solche, die nicht nullbar sind.

Standardmäßig geht Kotlin davon aus, dass der Wert nichtnull sein kann:

var a: String = "value"

assertEquals(a.length, 5)

Wir können der Referenza keinenull zuweisen, und wenn Sie dies versuchen, führt dies zu einem Compilerfehler.

If we want to create a nullable reference, we need to create append the question mark(?) to the type definition:

var b: String? = "value"

Danach können wir ihmnull zuweisen:

b = null

When we want to access the b reference, we must handle the null case explicitly, um einen Kompilierungsfehler zu vermeiden, da Kotlin weiß, dass diese Variablenull enthalten kann:

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

4. Sichere Anrufe

Die Handhabung jedes nullbaren Verweises auf diese Weise kann umständlich sein. Glücklicherweise hat Kotlin eine Syntax für "sichere Aufrufe" - diese Syntax ermöglicht es Programmierern,execute an action only when the specific reference holds a non-null value.

Definieren wir zwei Datenklassen, um diese Funktion zu veranschaulichen:

data class Person(val country: Country?)

data class Country(val code: String?)

Beachten Sie, dass die Feldercountry undcodevom Referenztyp nullbar sind.

Um fließend auf diese Felder zuzugreifen, können wir die sichere Aufrufsyntax verwenden:

val p: Person? = Person(Country("ENG"))

val res = p?.country?.code

assertEquals(res, "ENG")

Sollte die Variablepnull enthalten, gibt die Syntax für sichere Aufrufe ein Ergebnis vonnullzurück:

val p: Person? = Person(Country(null))

val res = p?.country?.code

assertNull(res)

4.1. Die Let () -Methode

Um eine Aktion nur auszuführen, wenn eine Referenz einen nicht nullbaren Wert enthält, können wir den Operatorletverwenden.

Nehmen wir an, wir haben eine Liste von Werten und in dieser Liste befindet sich auch einnull-Wert:

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

Als nächstes können wir eine Aktion für jedes nicht nullfähige Element dernames-Liste ausführen, indem wir einelet-Funktion verwenden:

var res = listOf()
for (item in names) {
    item?.let { res = res.plus(it) }
}

assertEquals(2, res.size)
assertTrue { res.contains(firstName) }
assertTrue { res.contains(secondName) }

4.2. Die Also () -Methode

Wenn wirto apply some additional operation, for example logging on every non-nullable value we can use analso() Methode wollen und verketten Sie es mitlet():

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

Es wird jedes Element ausgegeben, das nicht null ist:

non nullable value: Tom
non nullable value: Michael

4.3. Die Run () -Methode

Kotlin hat einerun()-Methode, um eine Operation für eine nullfähige Referenz auszuführen. Es istlet() sehr ähnlich, befindet sich jedoch innerhalb eines Funktionskörpers, der Run () -Methode operates on this reference instead of a function parameter:

var res = listOf()
for (item in names) {
    item?.run{res = res.plus(this)}
}

5. Elvis-Betreiber

Wenn wir eine Referenz haben, möchten wir manchmal einen Standardwert aus der Operation zurückgeben, wenn die Referenznull enthält. Um dies zu erreichen, können wir einen Operatorelvis (?:) verwenden. Dies entsprichtorElse/orElseGet aus der JavaOptional-Klasse:

val value: String? = null

val res = value?.length ?: -1

assertEquals(res, -1)

Wenn die Referenzvalueeinen nicht nullbaren Wert enthält, wird die Methodelength aufgerufen:

val value: String? = "name"

val res = value?.length ?: -1

assertEquals(res, 4)

6. Nullable Unsafe Get

Kotlin hat auch einen unsicheren Operator, um einen Wert eines nullbaren Feldes zu erhalten, ohne die Abwesenheitslogik explizit zu behandeln, aber er sollte sehr sorgfältig verwendet werden.

Der doppelte Ausrufezeichenoperator (!!) nimmt einen Wert aus einer nullbaren Referenz und löst einNullPointerException aus, wenn ernull. enthält. Dies entspricht der OperationOptional.get():

var b: String? = "value"
b = null

assertFailsWith {
    b!!.length
}

Wenn die nullfähige Referenz einen nicht nullfähigen Wert enthält, wird die Aktion für diesen Wert erfolgreich ausgeführt:

val b: String? = "value"

assertEquals(b!!.length, 5)

7. Filtern von Nullwerten aus einer Liste

Die KlasseList in Kotlin verfügt über eine DienstprogrammmethodefilterNotNull(), die nur nicht nullfähige Werte aus einer Liste zurückgibt, die nullfähige Referenzen enthält:

val list: List = listOf("a", null, "b")

val res = list.filterNotNull()

assertEquals(res.size, 2)
assertTrue { res.contains("a") }
assertTrue { res.contains("b") }

Dies ist ein sehr nützliches Konstrukt, das die Logik zusammenfasst, die wir sonst selbst implementieren müssten.

8. Fazit

In diesem Artikel haben wir Koltins Null-Sicherheitsfunktionen eingehend untersucht. Wir haben Arten von Referenzen gesehen, dienull Werte enthalten können, und solche, die dies nicht können. Wir haben die Verarbeitungslogik von fließendemnullmithilfe der Funktionen für sichere Anrufe und des Operators vonelvisimplementiert.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie inGitHub project - dies ist ein Maven-Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.