Parçalama bildirimi Kotlin'de nesneleri doğrudan değişken bildirimlerinde bileşenlerine "açmak" için kullanılmasını sağlar, bu da kodu daha net ve özlü hale getirir.
Varsayılan olarak, parçalamalar veri sınıfları ile çalışır ve koleksiyonlar için (bileşen fonksiyonları aracılığıyla) desteklenir. Bu, nesnenin sınıfındaki componentN() fonksiyonlarının kullanımına dayanır.
Veri sınıfı ile örnek:
data class User(val name: String, val age: Int) val user = User("Oleg", 32) val (name, age) = user println(name) // "Oleg" println(age) // 32
Özel sınıf için örnek:
class Point(val x: Int, val y: Int) { operator fun component1() = x operator fun component2() = y } val point = Point(1, 2) val (a, b) = point
Ayrıntılar ve incelikler:
for ((k, v) in map), burada k ve v anahtar/değer çiftleri verir.Soru: "Parçalamayı veri sınıfı olmayan bir sınıf için kullanabilir misiniz ve gereksinimleri nelerdir?"
Cevap: Evet. Sınıf içinde manuel olarak operator componentN fonksiyonlarını tanımlamanız gerekir. Veri sınıfı bunları otomatik olarak üretir, ancak herhangi bir sınıf bunları açıkça sağlayabilir.
Örnek:
class Pair<A, B>(val first: A, val second: B) { operator fun component1() = first operator fun component2() = second } val p = Pair(1, "q") val (a, b) = p
Durum
Bir projede, parçalamayı Map ile kullandılar ve parçalamanın her türlü yinelemeli koleksiyon için mevcut olduğunu yanlış anladılar. Sonuç olarak, List için "ComponentN eksik" hataları meydana geldi; burada birden fazla bileşen bekleniyordu ama yalnızca biri vardı ve bu, uygulamanın çökmesine neden oldu.
Durum
Bir modülde parçalama özelleştirilmiş sınıflara uygulanmıştı, ancak yeniden yapılandırma sonrasında operator
componentNfonksiyonlarını eklemeyi unuttular; bu yüzden kod derlendi ama çalışma zamanındaNoSuchMethodErrorhatası vererek üretim hizmetini çökertti.
Durum
Bir veri sınıfı değiştirildi — öznitelikler yeniden sıralandı, ancak eski parçalama bildirimleri değişmeden bırakıldı. Sonuç: değerler yanlış değişkenlere atanarak üretimde ciddi bir iş mantığı hatasına neden oldu.