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
val (a, b) = obj sözdizimiDestructuring 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.
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.
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, 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.
// 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.
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.
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.
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.
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
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.
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.
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.
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.
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
val (a, b) = obj, bir nesneyi tek bir ifadede birden çok değişkene ayırırAnahtar 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.
Ayrıca okuyun