@DslMarker: Mencegah Kebocoran Receiver
Gunakan anotasi @DslMarker untuk menegakkan aturan penyarangan DSL saat kompilasi.
@DslMarker: Mencegah Kebocoran Receiver adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Kotlin Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Kotlin Academy mencakup 4 pelajaran total.
Masalah Kebocoran Penerima
Dalam DSL yang bersarang, lambda pembangun bagian dalam dapat secara tidak sengaja mengakses anggota dari penerima luar. Misalnya, di dalam blok td { }, Anda mungkin memanggil tr { } dari cakupan tabel luar—padahal hal itu hampir tidak pernah dimaksudkan.
Seperti Apa Kebocoran Itu
Tanpa @DslMarker, kompilator mengizinkan pemanggilan fungsi dari cakupan luar dari lambda bagian dalam mana pun, sehingga penggunaan DSL menjadi membingungkan dan rentan terhadap kesalahan:
// Without @DslMarker — this compiles but is wrong:
html {
body {
table {
tr { // outer scope leaks in
tr { } // calling tr inside tr — nonsensical
}
}
}
}Memperkenalkan @DslMarker
@DslMarker adalah meta-anotasi yang Anda terapkan pada kelas anotasi Anda sendiri. Setiap kelas pembangun yang diberi anotasi DSL Anda akan menyembunyikan penerima implisitnya dalam lambda bersarang yang menggunakan anotasi DSL yang sama.
@DslMarker
annotation class HtmlDsl
@HtmlDsl
class Table
@HtmlDsl
class TrCara Kerja Penyembunyian Penerima Implisit
Ketika dua lambda bersarang memiliki penerima yang ditandai dengan anotasi @DslMarker yang sama, penerima luar disembunyikan di dalam lambda bagian dalam. Mengaksesnya secara langsung menyebabkan kesalahan saat kompilasi.
@DslMarker
annotation class HtmlDsl
@HtmlDsl class Html
@HtmlDsl class Body
@HtmlDsl class DivContoh Lengkap dengan @DslMarker
Deklarasikan anotasinya, tandai kelas pembangun, lalu pemanggilan ke metode dari cakupan luar akan terdeteksi saat kompilasi:
@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
}Melewati Pembatasan dengan this@
Jika Anda benar-benar perlu mengakses penerima luar dari lambda bagian dalam, gunakan referensi this@OuterClass berlabel. Cara ini bersifat eksplisit dan disengaja, tidak seperti kebocoran yang tidak disengaja.
fun ServerBuilder.database(block: DbBuilder.() -> Unit) {
val db = DbBuilder()
db.block()
val serverPort = this@ServerBuilder.port // explicit outer access
}@DslMarker dengan Beberapa DSL
DSL yang berbeda sebaiknya menggunakan anotasi @DslMarker yang berbeda. Dua DSL yang tidak berkaitan dan memiliki penanda berbeda tidak saling mengganggu meskipun disarangkan.
@DslMarker annotation class HtmlDsl
@DslMarker annotation class GradleDsl
// HtmlDsl and GradleDsl receivers do not hide each otherMenerapkan pada Pembangun dan Penerima
Terapkan anotasi DSL Anda pada kelas pembangun itu sendiri. Anotasi tersebut diteruskan ke parameter lambda mana pun yang tipe penerimanya adalah kelas tersebut. Tidak diperlukan anotasi tambahan pada fungsi individual.
Dukungan IDE
IntelliJ IDEA dan Android Studio segera menandai akses ke penerima luar sebagai kesalahan ketika @DslMarker digunakan. Hal ini memberikan umpan balik waktu nyata saat menulis atau menggunakan DSL Anda.
Merancang demi Keamanan
Desain DSL yang baik memasangkan setiap kelas pembangun dengan @DslMarker. Tambahan anotasi yang kecil ini secara drastis meningkatkan kemudahan penggunaan DSL dan mencegah seluruh kategori kesalahan bagi pengguna DSL.
Penggunaan di Pustaka Standar
@DslMarker milik Kotlin sendiri digunakan dalam kotlinx.html, DSL perutean Ktor, skrip Gradle Kotlin, serta pembangun buildMap/buildList. Anotasi ini merupakan alat fundamental dalam setiap perangkat DSL yang serius.
Pemeriksaan Singkat
Apa yang dicegah oleh @DslMarker?
Rangkuman: @DslMarker
Hal-hal penting:
- Tanpa
@DslMarker, penerima luar bocor ke dalam lambda DSL bagian dalam - Definisikan kelas anotasi yang diberi meta-anotasi, lalu terapkan pada semua kelas pembangun di DSL Anda
- Lambda bersarang dengan penanda yang sama tidak dapat secara tidak sengaja memanggil anggota dari cakupan luar
- Gunakan
this@OuterClassketika Anda benar-benar memerlukan akses ke cakupan luar
Pertanyaan yang Sering Diajukan
Apakah pelajaran “@DslMarker: Mencegah Kebocoran Receiver” gratis?
Ya — teks lengkap “@DslMarker: Mencegah Kebocoran Receiver” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Kotlin Academy, upgrade ke CoddyKit PRO. Kursus Kotlin Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “@DslMarker: Mencegah Kebocoran Receiver”?
Gunakan anotasi @DslMarker untuk menegakkan aturan penyarangan DSL saat kompilasi. Kamu berlatih Kotlin Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Kotlin Academy?
Tidak diperlukan pengalaman sebelumnya. Kotlin Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “@DslMarker: Mencegah Kebocoran Receiver” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Kotlin Academy ini?
Ya. Setiap pelajaran Kotlin Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Lambda dengan Receiver: Dasar DSL
- @DslMarker: Mencegah Kebocoran Receiver
- Membangun DSL HTML/Config yang Aman terhadap Tipe
- Menguji dan Mengembangkan DSL Tanpa Mengganggu Pengguna