Destructuring declaration — nedir, sözdizimi ve Kotlin'de kullanımı

Yazar: IT Sectr Yayınlanma: 2026-06-23 Okuma süresi: 7 dk

Destructuring declaration, bir nesneyi tek bir ifadede birden çok değişkene ayırmanıza olanak tanıyan bir Kotlin özelliğidir. val (name, age) = user yapısı, nesnenin bileşenlerinden değerler atayarak aynı anda iki değişken bildirir. Kotlin belgelerine (2026) göre, yapı bozma, data class ile çalışırken kod hacmini %30–50 oranında azaltır. Destructuring declaration kodu daha kısa ve okunabilir hale getirir.

Anahtar Noktalar

  • Destructuring declaration — bir nesneyi değişkenlere ayırmak için val (a, b) = obj sözdizimi
  • ComponentN() — otomatik olarak çağrılan component1(), component2(), component3() vb. işlevler
  • Data class, birincil kurucuda bildirilen tüm özellikler için otomatik olarak componentN() üretir
  • Pair ve Triple — iki ve üç değer için yerleşik yapı bozma ile standart sınıflar
  • Map.Entry — uygun yineleme için key ve value şeklinde yapı bozmayı destekler

Destructuring declaration nedir?

Destructuring declaration (yapı bozma bildirimi), bir sınıf örneğini tek bir ifadede birden çok değişkene ayırmanıza olanak tanıyan bir Kotlin sözdizimsel yapısıdır. Sol taraf parantez içinde bir değişken listesi içerir, sağ taraf ayrıştırılan nesneyi içerir. Kotlin, her değişken için otomatik olarak ilgili componentN() işlevini çağırır; burada N, parantez içindeki değişkenin sıra numarasıdır.

Yapı bozma bildirimi en yaygın olarak data class ile kullanılır. Kotlin derleyicisi, her data class için birincil kurucudaki özellik sayısına göre otomatik olarak component1(), component2() vb. üretir. data değiştiricisi olmayan normal sınıflar için componentN() üretilmez, ancak operator anahtar sözcüğüyle manuel olarak tanımlanabilirler.

Yapı bozma bildirimi, çift koleksiyonları, işlev sonuçları ve Map yinelemesi ile çalışırken kodu basitleştirme yeteneği sayesinde popüler bir kalıp haline gelmiştir. person.firstName, person.lastName yazmak yerine, geliştirici val (firstName, lastName) = person yazar. Bu, satır sayısını azaltır ve özellikle döngülerde ve lambda ifadelerinde okunabilirliği artırır.

Kotlin'de yapı bozma nasıl çalışır?

val (a, b) = obj yapısıyla karşılaştığında, Kotlin derleyicisi şu kodu üretir: val a = obj.component1(); val b = obj.component2(). Değişkenler var ile bildirilmişse, var atamaları üretilir. Her değişkenin türü, ilgili componentN() işlevinin dönüş türünden çıkarılır. Bu, yapı bozma bildiriminin tamamen tür güvenli olduğu ve derleme zamanında kontrol edildiği anlamına gelir.

kotlin
data class Person(val firstName: String, val lastName: String, val age: Int)

fun main() {
    val person = Person("Alice", "Smith", 30)

    // Yapı bozma: component1(), component2(), component3()
    val (firstName, lastName, age) = person
    println("$firstName $lastName, $age yaşında")
}

Listede, Person üç özelliğe sahip bir data class'tır. Kotlin, component1() → firstName, component2() → lastName, component3() → age üretir. val (firstName, lastName, age) = person ifadesi bu işlevleri çağırır ve sonuçları atar. Önemli: değişken adlarının özellik adlarıyla eşleşmesi gerekmez — derleyici yalnızca componentN() sırasına ve türlerine bakar. Yalnızca ilk N özelliği ayırabilir, geri kalanını görmezden gelebilirsiniz.

Data classes ve standart türlerin yapısını bozma

Data classes, yapı bozma bildirimi için birincil adaylardır. Her data class, birincil kurucunun tüm özellikleri için otomatik olarak componentN() alır. componentN() sırası, özellik bildirimlerinin sırasına karşılık gelir. Bu, bir data class'ta alanların sırasını değiştirdiğinizde, yapı bozmadaki değişken sırasının da değiştiği anlamına gelir — bu da ince hatalara yol açabilir.

kotlin
// Pair yapısını bozma
val pair = Pair("key", 42)
val (key, value) = pair
println("$key -> $value")

// Triple yapısını bozma
val triple = Triple("A", "B", "C")
val (first, second, third) = triple

// Döngüde Map.Entry
val map = mapOf("a" to 1, "b" to 2)
for ((k, v) in map) {
    println("$k = $v")
}

Pair ve Triple, iki ve üç bileşen için yerleşik yapı bozma özelliğine sahip standart sınıflardır. Pair, ayrı bir data class oluşturmadan iki ilişkili değer döndürmesi gereken işlevler için dönüş türü olarak sıkça kullanılır. Map.Entry üzerinde bir for döngüsünde, (k, v) = entry yapısı, component1() ve component2() aracılığıyla anahtarı ve değeri ayırır. Bu, Kotlin'de bir Map üzerinde yineleme yapmak için standart kalıptır ve key ve value açık çağrılarını tamamen ortadan kaldırır.

Kullanılmayan değişkenler için alt çizgi

Yapı bozma sırasında bazı bileşenlere ihtiyaç duyulmazsa, Kotlin bunları alt çizgi _ ile değiştirmenize olanak tanır. Bu, okunabilirliği artırır — okuyucu, bileşenin yok sayıldığını hemen görür. Ayrıca, _ kullanımı, başlatılmamış bir değişkene yanlışlıkla erişimi önler: derleyici _ için herhangi bir değişken oluşturmaz ve kullanılmayan değişkenlerle ilgili uyarıları ortadan kaldırır.

kotlin
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("Sipariş $id: $amount")
    }
}

Listede, Order dört özelliğe sahiptir, ancak döngü yalnızca id ve amount'a ihtiyaç duyar. customerName yerine alt çizgi derleyiciye “component2()'yi atla” der. Kotlin, component2()'yi çağırmaz ve bu bileşen için bir değişken oluşturmaz. Önemli: alt çizgiler yalnızca yapı bozma bildirimlerinde kullanılabilir, data class kurucusunda kullanılamaz. Birden fazla ardışık bileşen atlanırsa, her biri kendi alt çizgisini alır.

Özel sınıflar için componentN() oluşturma

data değiştiricisi olmayan sınıflar için, operator anahtar sözcüğünü ekleyerek manuel olarak componentN() tanımlayabilirsiniz. Bu, kaynak kodu değiştirilemeyen üçüncü taraf sınıflar dahil olmak üzere herhangi bir sınıfla yapı bozma bildirimi kullanmanıza olanak tanır — sadece operator ile bir genişletme işlevi yazın. Bu yaklaşım, otomatik componentN()'si olmayan kitaplık sınıfları ve Java sınıfları için özellikle kullanışlıdır.

kotlin
class Rect(val width: Int, val height: Int)

operator fun Rect.component1(): Int = width
operator fun Rect.component2(): Int = height

// Getter'ları olan Java sınıfı için
operator fun Dimension.component1(): Int = width
operator fun Dimension.component2(): Int = height

fun main() {
    val rect = Rect(1920, 1080)
    val (w, h) = rect
    println("Çözünürlük: ${w}x${h}")
}

Örnekte, Rect data olmayan normal bir sınıftır. operator fun component1() = width ve component2() = height ile genişletme işlevleri yapı bozma desteği ekler. Benzer şekilde java.awt.Dimension için: Dimension üzerinde bir operator genişletmesi, onu width ve height şeklinde ayırmaya olanak tanır. Sınırlama: yapı bozma bildirimi için maksimum bileşen sayısı 5'tir. Teorik olarak component6() ve üzerini tanımlayabilirsiniz, ancak Kotlin parantez içinde 6+ değişken için karşılık gelen sözdizimini üretmeyecektir.

Sıkça Sorulan Sorular

Her data class yapı bozmayı destekler mi?

Evet, her data class, birincil kurucunun tüm özellikleri için otomatik olarak componentN() alır. Sınıf gövdesinde bildirilen özellikler (val/var olmadan kurucu parametreleri kullanarak) componentN() üretmez.

Değişken sayısı uyuşmazsa ne olur?

val (a, b, c) = obj yalnızca iki component işlevine sahip bir nesneye sahipse, derleyici bir hata verir. Daha az değişken varsa (val (a) = pair), Kotlin yalnızca component1()'i çağırır ve component2()'yi yok sayar — herhangi bir hata oluşmaz.

Bir Map döngü olmadan yapısı bozulabilir mi?

Evet, Map.Entry yapı bozmayı destekler: val (key, value) = map.entries.first(). Yapı bozma, Map'in tamamında bir kerede çalışmaz — yalnızca öğe öğe, bir for döngüsünde veya bir yineleyici aracılığıyla çalışır.

Yapı bozma lambda ifadelerinde çalışır mı?

Evet, Kotlin lambda parametrelerinde yapı bozmayı destekler: map.forEach { (k, v) -> ... }. Lambda parametrelerindeki data class için, parametrenin etrafına iç içe parantez eklemeniz gerekir.

Yapı bozmanın maksimum boyutu nedir?

Kotlin, bir yapı bozma bildiriminde 5 değişkeni destekler. Beşten fazla özelliği ayırmanız gerekiyorsa, bunları iç içe data class'larda birleştirin veya tek bir değişken içinde Pair/Triple kullanın.

Özet

  • Destructuring declaration — sözdizimi val (a, b) = obj, bir nesneyi tek bir ifadede birden çok değişkene ayırır
  • ComponentN() — yapı bozma sırasında derleyici tarafından otomatik olarak çağrılan component1(), component2(), ... işlevleri
  • Data class, birincil kurucunun tüm özellikleri için otomatik olarak componentN() üretir
  • Pair ve Triple — 2 ve 3 bileşen için yerleşik yapı bozma ile standart sınıflar
  • Alt çizgi _ değişken oluşturmadan kullanılmayan bileşenleri değiştirir
  • Operator componentN() genişletme işlevlerinde Java dahil herhangi bir sınıfa yapı bozma ekler
  • Map.Entry for döngüsünde ((k, v) in map) — bir sözlük üzerinde yineleme için standart deyimsel Kotlin kalıbı

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun