Destructuring declaration — adalah kemampuan Kotlin untuk mengurai objek menjadi beberapa variabel dalam satu ekspresi. Konstruksi val (name, age) = user secara bersamaan mendeklarasikan dua variabel, menetapkan nilai dari komponen objek. Menurut dokumentasi Kotlin (2026), destructuring mengurangi volume kode saat bekerja dengan data class sebesar 30–50%. Destructuring declaration membuat kode lebih ringkas dan mudah dibaca.
Poin utama
Destructuring declaration (deklarasi destructuring) — adalah konstruksi sintaksis Kotlin yang memungkinkan Anda mengurai instance kelas menjadi beberapa variabel dalam satu ekspresi. Sisi kiri berisi daftar variabel dalam tanda kurung, sisi kanan — objek yang akan diurai. Kotlin secara otomatis memanggil untuk setiap variabel fungsi componentN() yang sesuai, di mana N adalah nomor urut variabel dalam tanda kurung.
Destructuring declaration paling sering digunakan dengan data class. Kompiler Kotlin secara otomatis menghasilkan untuk data class fungsi component1(), component2() dan seterusnya — sesuai dengan jumlah properti di constructor utama. Untuk kelas biasa tanpa modifier data, componentN() tidak dihasilkan, tetapi dapat didefinisikan secara manual sebagai fungsi operator dengan kata kunci operator.
Destructuring declaration telah menjadi pola populer karena kemampuannya untuk menyederhanakan kode saat bekerja dengan koleksi pasangan, hasil fungsi, dan penelusuran Map. Alih-alih menulis person.firstName, person.lastName, pengembang menulis val (firstName, lastName) = person. Ini mengurangi jumlah baris dan meningkatkan keterbacaan, terutama dalam perulangan dan lambda.
Saat menemukan konstruksi val (a, b) = obj, kompiler Kotlin menghasilkan kode: val a = obj.component1(); val b = obj.component2(). Jika variabel dideklarasikan dengan var, penugasan var akan dihasilkan. Tipe setiap variabel disimpulkan dari tipe kembalian fungsi componentN() yang sesuai. Ini berarti destructuring declaration sepenuhnya aman tipe dan diperiksa pada tahap kompilasi.
data class Person(val firstName: String, val lastName: String, val age: Int)
fun main() {
val person = Person("Alice", "Smith", 30)
// Destructuring: component1(), component2(), component3()
val (firstName, lastName, age) = person
println("$firstName $lastName, $age tahun")
}
Dalam listing Person — data class dengan tiga properti. Kotlin menghasilkan component1() → firstName, component2() → lastName, component3() → age. Ekspresi val (firstName, lastName, age) = person memanggil fungsi-fungsi ini dan menetapkan hasilnya. Penting: nama variabel mungkin tidak cocok dengan nama properti — kompiler hanya melihat urutan componentN() dan tipenya. Anda hanya dapat mengurai N properti pertama, mengabaikan sisanya.
Data class — kandidat utama untuk destructuring declaration. Setiap data class secara otomatis mendapatkan componentN() untuk semua properti constructor utama. Urutan componentN() sesuai dengan urutan deklarasi properti. Ini berarti saat mengubah urutan bidang di data class, urutan variabel dalam destructuring berubah — yang dapat menyebabkan bug yang tidak terlihat.
// Destructuring Pair
val pair = Pair("key", 42)
val (key, value) = pair
println("$key -> $value")
// Destructuring Triple
val triple = Triple("A", "B", "C")
val (first, second, third) = triple
// Map.Entry dalam perulangan
val map = mapOf("a" to 1, "b" to 2)
for ((k, v) in map) {
println("$k = $v")
}
Pair dan Triple — kelas standar dengan destructuring siap pakai untuk dua dan tiga komponen. Pair sering digunakan sebagai tipe kembalian fungsi yang perlu mengembalikan dua nilai terkait tanpa membuat data class terpisah. Dalam perulangan for pada Map.Entry, konstruksi (k, v) = entry mengurai kunci dan nilai melalui component1() dan component2(). Ini adalah pola standar untuk menelusuri Map di Kotlin, yang sepenuhnya menggantikan panggilan eksplisit key dan value.
Jika dalam destructuring beberapa komponen tidak diperlukan, Kotlin memungkinkan untuk menggantinya dengan garis bawah _. Ini meningkatkan keterbacaan — pembaca langsung melihat bahwa komponen diabaikan. Selain itu, penggunaan _ mencegah akses tidak sengaja ke variabel yang belum diinisialisasi: kompiler tidak membuat variabel apa pun untuk _, yang menghilangkan peringatan tentang variabel yang tidak digunakan.
data class Order(
val id: Long,
val customerName: String,
val amount: Double,
val status: String
)
fun process(orders: List<Order>) {
for ((id, _, amount) in orders) {
println("Pesanan $id: $amount")
}
}
Dalam listing Order memiliki empat properti, tetapi dalam perulangan hanya id dan amount yang diperlukan. Garis bawah di tempat customerName memberi tahu kompiler “lewati component2()”. Kotlin tidak memanggil component2() dan tidak membuat variabel untuk komponen ini. Penting: garis bawah hanya dapat digunakan dalam destructuring declaration, tetapi tidak di constructor data class. Jika beberapa komponen dilewati berturut-turut, masing-masing memiliki garis bawah sendiri.
Untuk kelas tanpa modifier data, Anda dapat mendefinisikan componentN() secara manual dengan menambahkan kata kunci operator. Ini memungkinkan penggunaan destructuring declaration dengan kelas apa pun, termasuk kelas pihak ketiga yang kode sumbernya tidak dapat diubah — cukup tulis fungsi ekstensi dengan operator. Pendekatan ini sangat berguna untuk kelas pustaka dan kelas dari kode Java yang tidak memiliki componentN() otomatis.
class Rect(val width: Int, val height: Int)
operator fun Rect.component1(): Int = width
operator fun Rect.component2(): Int = height
// Untuk kelas Java dengan getter
operator fun Dimension.component1(): Int = width
operator fun Dimension.component2(): Int = height
fun main() {
val rect = Rect(1920, 1080)
val (w, h) = rect
println("Resolusi: ${w}x${h}")
}
Dalam contoh Rect — kelas biasa tanpa data. Fungsi ekstensi dengan operator fun component1() = width dan component2() = height menambahkan dukungan destructuring. Demikian pula untuk java.awt.Dimension: ekstensi operator pada Dimension memungkinkan penguraiannya menjadi width dan height. Keterbatasan: jumlah maksimum komponen untuk destructuring declaration — 5. Secara teoritis Anda dapat mendefinisikan component6() dan lebih tinggi, tetapi Kotlin tidak akan menghasilkan sintaksis yang sesuai untuk 6+ variabel dalam tanda kurung.
Pertanyaan yang sering diajukan
Ya, setiap data class secara otomatis mendapatkan componentN() untuk semua properti constructor utama. Properti yang dideklarasikan di badan kelas (melalui constructor tanpa val/var) tidak menghasilkan componentN().
Jika dalam val (a, b, c) = obj objek hanya memiliki dua fungsi component, kompiler akan memberikan kesalahan. Jika variabel lebih sedikit (val (a) = pair), Kotlin hanya akan memanggil component1() dan mengabaikan component2() — kesalahan tidak akan terjadi.
Ya, Map.Entry mendukung destructuring: val (key, value) = map.entries.first(). Untuk seluruh Map sekaligus destructuring tidak berfungsi — hanya elemen per elemen, dalam perulangan for atau melalui iterator.
Ya, Kotlin mendukung destructuring dalam parameter lambda: map.forEach { (k, v) -> ... }. Untuk data class dalam parameter lambda, Anda perlu menambahkan tanda kurung bersarang di sekitar parameter.
Kotlin mendukung hingga 5 variabel dalam destructuring declaration. Jika Anda perlu mengurai lebih dari lima properti, gabungkan dalam data class bersarang atau gunakan Pair/Triple di dalam satu variabel.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga