Magie de Kotlin : Que fait le mot-clé `by` et comment simplifie-t-il le code ?

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : Un petit opérateur — une grande magie

\n\n

Avez-vous déjà regardé du code Kotlin et vu une étrange construction comme val name by lazy { ... } ou class Derived(Base by impl) ? Si oui, vous vous êtes sûrement demandé : « Que fait le mot-clé by en Kotlin ? ». Cette question est l'une des plus populaires sur Stack Overflow, et pour cause. by n'est pas qu'un sucre syntaxique, c'est un mécanisme puissant de délégation qui peut considérablement simplifier votre code, le rendre plus propre et éliminer des tonnes de code passe-partout.

\n\n

Dans cet article, nous allons décortiquer by de A à Z. Vous apprendrez comment fonctionnent la délégation de propriétés (property delegation) et la délégation de classes (class delegation). Nous répondrons aux questions les plus fréquentes des débutants et montrerons des exemples concrets que vous pourrez immédiatement appliquer dans vos projets. C'est parti !

\n\n

Qu'est-ce que la délégation en Kotlin ? (L'idée principale)

\n\n

Avant de plonger dans les détails, comprenons l'essence. La délégation est un patron de conception dans lequel un objet confie l'exécution de sa tâche à un autre objet assistant. Kotlin a intégré ce patron directement dans le langage avec le mot-clé by. Au lieu d'écrire le code « à la main », vous dites au compilateur : « Hé, que cette chose fasse tout à ma place ».

\n\n

En Kotlin, il existe deux principaux types de délégation :

\n
    \n
  • Délégation de propriétés — lorsque le getter/setter d'une propriété est confié à un autre objet.
  • \n
  • Délégation de classes — lorsque l'implémentation d'une interface est confiée à un autre objet.
  • \n
\n\n

Les deux utilisent le même mot-clé — by. Analysons chacun.

\n\n

1. Délégation de propriétés (Property Delegation) : by pour les champs

\n\n

C'est l'utilisation la plus populaire de by. Elle permet de réutiliser la logique pour les getters et setters des propriétés. Au lieu d'écrire du code similaire à chaque fois, vous utilisez des délégués prêts à l'emploi ou les vôtres.

\n\n

Exemple 1 : by lazy — initialisation paresseuse

\n\n

Imaginez que vous ayez une propriété dont la création est longue (par exemple, qui charge des données depuis le réseau). Vous ne voulez pas la calculer lors de la création de la classe, mais lors de la première utilisation. by lazy fait exactement cela :

\n\n
val heavyData: String by lazy {\n    println("Calcul des données...")\n    "Résultat très lourd"\n}\n\nfun main() {\n    println("Début")\n    println(heavyData) // Premier appel : on calcule\n    println(heavyData) // Deuxième appel : on prend depuis le cache\n}
\n\n

Sortie :

\n
Début\nCalcul des données...\nRésultat très lourd\nRésultat très lourd
\n\n

Que s'est-il passé ici ? Le mot-clé by indique : « La propriété heavyData délègue son implémentation à l'objet lazy { ... } ». Cet objet garantit que le bloc de code ne s'exécutera qu'une seule fois, lors de la première utilisation, puis stockera le résultat. C'est idéal pour les configurations, les connexions à la base de données et autres objets « coûteux ».

\n\n

Exemple 2 : by observable — surveiller les changements

\n\n

Vous voulez exécuter une action à chaque fois qu'une propriété change ? Utilisez Delegates.observable de la bibliothèque standard :

\n\n
import kotlin.properties.Delegates\n\nvar watchedValue: Int by Delegates.observable(0) { property, oldValue, newValue ->\n    println("Ancien : $oldValue, Nouveau : $newValue")\n}\n\nfun main() {\n    watchedValue = 10  // Ancien : 0, Nouveau : 10\n    watchedValue = 42  // Ancien : 10, Nouveau : 42\n}
\n\n

Ce patron est indispensable pour la programmation réactive, la validation de données ou la synchronisation de l'interface utilisateur. D'ailleurs, by fonctionne ici exactement de la même manière.

Blogs

Book Recommendations