Guide complet sur la sécurité nulle à Kotlin

Guide complet sur la sécurité nulle à Kotlin

1. Vue d'ensemble

Dans cet article, nous examinerons les fonctionnalités de sécurité nulles intégrées au langage Kotlin. Kotlin fournit une gestion complète et native des champs nullables - aucune bibliothèque supplémentaire n'est nécessaire.

2. Dépendance Maven

Pour commencer, vous devrez ajouter la dépendance Mavenkotlin-stdlib à vospom.xml:


    org.jetbrains.kotlin
    kotlin-stdlib
    1.1.1

Vous pouvez trouver la dernière version surMaven Central.

3. Types de référence Nullable et Non Nullable

Kotlin has two types of references qui sont interprétés par le compilateur pour donner au programmeur des informations sur l'exactitude d'un programme au moment de la compilation - ceux qui sont nullables et ceux qui ne le sont pas.

Par défaut, Kotlin suppose que la valeur ne peut pas êtrenull:

var a: String = "value"

assertEquals(a.length, 5)

Nous ne pouvons pas affecternull à la référencea, et si vous essayez de le faire, cela provoquera une erreur du compilateur.

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

var b: String? = "value"

Après cela, nous pouvons lui attribuernull:

b = null

When we want to access the b reference, we must handle the null case explicitly pour éviter une erreur de compilation car Kotlin sait que cette variable peut contenirnull:

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

4. Appels sécurisés

Gérer toutes les références annulables de cette manière pourrait être fastidieux. Heureusement, Kotlin a une syntaxe pour les «appels sécurisés» - cette syntaxe permet aux programmeurs deexecute an action only when the specific reference holds a non-null value.

Définissons deux classes de données pour illustrer cette fonctionnalité:

data class Person(val country: Country?)

data class Country(val code: String?)

Notez que les champscountry etcode sont de type référence Nullable.

Pour accéder à ces champs de manière fluide, nous pouvons utiliser la syntaxe d'appel sécurisé:

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

val res = p?.country?.code

assertEquals(res, "ENG")

Si la variablep contient unnull, la syntaxe des appels sécurisés renverra un résultatnull:

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

val res = p?.country?.code

assertNull(res)

4.1. La méthode Let ()

Pour exécuter une action uniquement lorsqu'une référence contient une valeur non nullable, nous pouvons utiliser un opérateurlet.

Disons que nous avons une liste de valeurs et qu'il y a aussi une valeurnull dans cette liste:

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

Ensuite, nous pouvons exécuter une action sur chaque élément non nullable de la listenames en utilisant une fonctionlet:

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. La méthode Also ()

Si nous voulons la méthodeto apply some additional operation, for example logging on every non-nullable value we can use analso() et la chaînons avec unlet():

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

Il affichera tous les éléments non nuls:

non nullable value: Tom
non nullable value: Michael

4.3. La méthode Run ()

Kotlin a une méthoderun() pour exécuter une opération sur une référence Nullable. Il est très similaire àlet() mais à l'intérieur d'un corps de fonction, la méthode Run () operates on this reference instead of a function parameter:

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

5. Elvis Opérateur

Parfois, lorsque nous avons une référence, nous voulons renvoyer une valeur par défaut de l'opération si la référence contient unnull. Pour y parvenir, nous pouvons utiliser un opérateurelvis (?:). C'est un équivalent deorElse/orElseGet de la classe JavaOptional:

val value: String? = null

val res = value?.length ?: -1

assertEquals(res, -1)

Lorsque la référencevalue contient une valeur non nullable, la méthodelength sera invoquée:

val value: String? = "name"

val res = value?.length ?: -1

assertEquals(res, 4)

6. Nullable Unsafe Get

Kotlin a également un opérateur unsafe pour obtenir une valeur d'un champ Nullable sans gérer explicitement la logique d'absence, mais il doit être utilisé très soigneusement.

L'opérateur de point d'exclamation double (!!) prend une valeur à partir d'une référence Nullable et renvoie unNullPointerException s'il contientnull. C'est l'équivalent de l'opérationOptional.get():

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

assertFailsWith {
    b!!.length
}

Si la référence nullable contient une valeur non nullable, l'action sur cette valeur sera exécutée avec succès:

val b: String? = "value"

assertEquals(b!!.length, 5)

7. Filtrage des valeurs nulles à partir d'une liste

La classeList dans Kotlin a une méthode utilitairefilterNotNull() qui ne renvoie que les valeurs non Nullables d'une liste contenant des références Nullables:

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

val res = list.filterNotNull()

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

C'est une construction très utile qui résume la logique que nous aurions autrement besoin de mettre en œuvre nous-mêmes.

8. Conclusion

Dans cet article, nous avons exploré en profondeur les fonctionnalités de sécurité nulles de Koltin. Nous avons vu des types de références qui peuvent contenir des valeursnull et celles qui ne le peuvent pas. Nous avons implémenté la logique de traitement fluide denull en utilisant les fonctionnalités «appel sécurisé» et l'opérateurelvis.

L'implémentation de tous ces exemples et extraits de code peut être trouvée dans leGitHub project - il s'agit d'un projet Maven, il devrait donc être facile à importer et à exécuter tel quel.