Historia pytania: Kotlin od samego początku wspiera mechanizm „destrukturyzacji”, który umożliwia wygodne wydobywanie wartości z obiektów, kolekcji, zwracanych danych funkcji. Mechanizm ten został zainspirowany językami takimi jak Scala i JavaScript (destrukturyzacja ES6).
Problem: W klasycznych językach OOP, aby wydobyć kilka właściwości obiektu, trzeba było albo jawnie odwoływać się do każdego pola, albo korzystać z pośrednich struktur, co prowadziło do nadmiarowości. Szczególnie niewygodne jest to w pętlach, przetwarzaniu par z Map lub podczas pracy z klasami danych.
Rozwiązanie: Deklaracje destrukturyzujące pozwalają na zadeklarowanie kilku zmiennych i przypisanie im wartości z obiektu w jednym wierszu, dzięki realizacji funkcji komponentowych (componentN) w klasach.
Przykład kodu:
data class Person(val name: String, val age: Int) val (n, a) = Person("Alex", 25) println("Nazwa: $n, Wiek: $a") // Nazwa: Alex, Wiek: 25 val map = mapOf(1 to "a", 2 to "b") for ((key, value) in map) println("$key = $value")
Kluczowe cechy:
Czy można destrukturyzować dowolną klasę?
Nie. Wymagane są metody componentN. Klasy danych oraz standardowe pary/trójki już je zawierają. W przypadku zwykłych klas można je dodać ręcznie.
Przykład:
class Point(val x: Int, val y: Int) { operator fun component1() = x operator fun component2() = y } val (cx, cy) = Point(5, 10)
Co się stanie, jeśli spróbujesz destrukturyzować obiekt z mniejszą liczbą componentN?
Kompilator zgłosi błąd, jeśli spróbujesz zadeklarować więcej zmiennych, niż jest zrealizowanych componentN:
data class OnlyX(val x: Int) val (x, y) = OnlyX(5) // Błąd! Brak component2()
Czy można destrukturyzować wartość zwracaną w funkcji?
Tak! Funkcja może zwracać parę (Pair), trójkę (Triple) lub klasę danych - destrukturyzacja to wspiera:
fun coords() = Pair(1, 2) val (x, y) = coords()
Do funkcji przekazywana jest klasa danych z pięcioma polami; destrukturyzacja używana jest z pięcioma zmiennymi. Po pewnym czasie dodano pole — wzorzec wymaga przemyślenia całej logiki analizy, czasami pojawiają się nieużywane zmienne.
Zalety:
Wady:
Destrukturyzacja używana jest tylko dla klas danych z 2–3 polami (na przykład, x, y współrzędne), lub podczas przeglądania mapy, gdzie struktura jest niezmiennie ustalona.
Zalety:
Wady: