@DslMarker : empêcher les fuites de récepteurs
Utilisez les annotations @DslMarker pour faire respecter les règles d’imbrication des DSL lors de la compilation.
@DslMarker : empêcher les fuites de récepteurs est une leçon Kotlin Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Kotlin Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Kotlin Academy comprend 4 leçons au total.
Le problème de fuite du récepteur
Dans les DSL imbriqués, une lambda de construction interne peut accidentellement accéder aux membres d'un récepteur externe. Par exemple, dans un bloc td { }, vous pourriez appeler tr { } depuis la portée de la table externe — ce qui n'est presque jamais souhaité.
À quoi ressemble une fuite
Sans @DslMarker, le compilateur autorise l'appel de fonctions de la portée externe depuis n'importe quelle lambda interne, ce qui conduit à une utilisation déroutante et sujette aux erreurs des DSL :
// Without @DslMarker — this compiles but is wrong:
html {
body {
table {
tr { // outer scope leaks in
tr { } // calling tr inside tr — nonsensical
}
}
}
}Présentation de @DslMarker
@DslMarker est une méta-annotation que vous appliquez à votre propre classe d'annotation. Toute classe de construction annotée avec votre annotation DSL verra son récepteur implicite masqué dans les lambdas imbriquées qui utilisent la même annotation DSL.
@DslMarker
annotation class HtmlDsl
@HtmlDsl
class Table
@HtmlDsl
class TrFonctionnement du masquage du récepteur implicite
Lorsque deux lambdas imbriquées possèdent toutes deux un récepteur marqué avec la même annotation @DslMarker, le récepteur externe est masqué dans la lambda interne. Y accéder directement provoque une erreur de compilation.
@DslMarker
annotation class HtmlDsl
@HtmlDsl class Html
@HtmlDsl class Body
@HtmlDsl class DivExemple complet avec @DslMarker
Déclarez l'annotation, marquez les classes de construction, puis les appels imbriqués aux méthodes de la portée externe seront détectés lors de la compilation :
@DslMarker
annotation class MyCfgDsl
@MyCfgDsl
class ServerBuilder {
var port: Int = 8080
fun database(block: DbBuilder.() -> Unit) { /*...*/ }
}
@MyCfgDsl
class DbBuilder {
var url: String = ""
// Cannot call ServerBuilder.port here — compiler error
}Contourner la restriction avec this@
Si vous devez réellement accéder à un récepteur externe depuis une lambda interne, utilisez une référence this@OuterClass avec étiquette. Cet accès est explicite et intentionnel, contrairement à une fuite accidentelle.
fun ServerBuilder.database(block: DbBuilder.() -> Unit) {
val db = DbBuilder()
db.block()
val serverPort = this@ServerBuilder.port // explicit outer access
}@DslMarker avec plusieurs DSL
Les différents DSL doivent utiliser des annotations @DslMarker différentes. Deux DSL indépendants dotés de marqueurs différents n'interfèrent pas l'un avec l'autre, même lorsqu'ils sont imbriqués.
@DslMarker annotation class HtmlDsl
@DslMarker annotation class GradleDsl
// HtmlDsl and GradleDsl receivers do not hide each otherAppliquer aux constructeurs et aux récepteurs
Appliquez votre annotation DSL directement à la classe de construction. L'annotation se propage à tout paramètre de lambda dont le type de récepteur est cette classe. Il n'est pas nécessaire d'annoter davantage les fonctions individuelles.
Prise en charge par l'IDE
IntelliJ IDEA et Android Studio signalent immédiatement l'accès au récepteur externe comme une erreur lorsque @DslMarker est utilisé. Vous bénéficiez ainsi d'un retour en temps réel lors de la création ou de l'utilisation de votre DSL.
Concevoir pour la sécurité
Une bonne conception de DSL associe chaque classe de construction à @DslMarker. Cette légère surcharge d'annotation améliore considérablement l'ergonomie du DSL et évite des catégories entières de bogues pour ses utilisateurs.
Utilisation dans la bibliothèque standard
La propre annotation @DslMarker de Kotlin est utilisée dans kotlinx.html, le DSL de routage de Ktor, les scripts Kotlin de Gradle et les constructeurs buildMap/buildList. C'est un outil fondamental de toute boîte à outils DSL sérieuse.
Vérification rapide
Qu'empêche @DslMarker ?
Récapitulatif : @DslMarker
Points essentiels :
- Sans
@DslMarker, les récepteurs externes s'infiltrent dans les lambdas DSL internes - Définissez une classe d'annotation dotée d'une méta-annotation et appliquez-la à toutes les classes de construction de votre DSL
- Les lambdas imbriquées portant le même marqueur ne peuvent pas appeler accidentellement les membres de la portée externe
- Utilisez
this@OuterClasslorsque vous devez réellement accéder à la portée externe
Questions Fréquemment Posées
La leçon « @DslMarker : empêcher les fuites de récepteurs » est-elle gratuite ?
Oui — le texte complet de « @DslMarker : empêcher les fuites de récepteurs » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Kotlin Academy, passe à CoddyKit PRO. Le cours Kotlin Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « @DslMarker : empêcher les fuites de récepteurs » ?
Utilisez les annotations @DslMarker pour faire respecter les règles d’imbrication des DSL lors de la compilation. Tu pratiques Kotlin Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Kotlin Academy ?
Aucune expérience préalable n'est requise. Kotlin Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « @DslMarker : empêcher les fuites de récepteurs » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Kotlin Academy ?
Oui. Chaque leçon Kotlin Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Lambda avec récepteur : fondement des DSL
- @DslMarker : empêcher les fuites de récepteurs
- Construire un DSL HTML/de configuration sûr du point de vue des types
- Tester et faire évoluer des DSL sans perturber les utilisateurs