ProgrammationDéveloppeur Backend

Quelle est la différence entre les mots-clés "val" et "var" en Kotlin ? Comment les utiliser de manière optimale en termes de sécurité et de performance du code ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

val et var sont tous deux utilisés pour déclarer des variables, mais ils ont des différences fondamentales :

  • val (valeur) : déclare une référence immuable, en lecture seule. Après initialisation, la valeur ne peut pas être réaffectée, la référence reste toujours sur un seul objet :
val number = 42 // number = 10 // erreur !
  • var (variable) : déclare une variable mutable ;
var counter = 0 counter++ // autorisé

Sécurité et performance :

  • Il est préférable d'utiliser val partout où la variable ne doit pas changer — cela protège contre les modifications accidentelles et rend le code plus facile à comprendre.
  • L'utilisation de val permet au compilateur et à l'IDE de détecter les erreurs au moment de la compilation et d'optimiser le code.

Question piège.

Un objet déclaré comme val peut-il être modifié ?

Réponse : La valeur de la variable elle-même (référence) ne peut pas être réaffectée, mais si c'est un objet (par exemple, une liste), son état interne peut être modifié.

val list = mutableListOf(1, 2) list.add(3) // Possible ! En revanche, list = autreListe sera une erreur.

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet.


Histoire

Dans un projet de magasin en ligne, un développeur a défini la liste des produits comme val items = mutableListOf<Product>(), pensant que la liste était complètement immuable. En réalité, à un autre endroit, la liste a été modifiée (un nouvel élément a été ajouté), ce qui a affecté de manière inattendue l'affichage du panier.


Histoire

Dans un parseur de grands fichiers texte, le tampon tableau a été déclaré comme var buffer, bien qu'il n'ait pas eu besoin d'être remplacé pendant le processus de parsing. Une réaffectation accidentelle à un nouveau tableau a entraîné une fuite de mémoire et un traitement incorrect des données.


Histoire

Dans le code d'un microservice, la plupart des variables étaient déclarées comme var "au cas où", ce qui a conduit à des modifications d'état de l'objet dans différents threads dans de grandes expressions, entraînant des bugs difficiles à détecter en raison d'une condition de course.