Deklaracje destrukturyzujące umożliwiają "rozłożenie" obiektu na zmienne bezpośrednio w deklaracji, co sprawia, że kod jest bardziej zwięzły. Historycznie w Javie i innych językach wymagane było pisanie osobnego getter'a dla każdego komponentu, co czyniło składnię niezgrabną. Kotlin wprowadził specjalne metody componentN() dla wsparcia destrukturyzacji.
Problem: Niewygodne manualne pobieranie części złożonego obiektu — potrzeba wielu przypisań, co prowadzi do utraty czytelności kodu.
Rozwiązanie: klasa danych automatycznie otrzymuje metody componentN() podczas kompilacji, które pozwalają na użycie deklaracji destrukturyzujących do pobierania wartości właściwości.
Przykład kodu:
data class User(val name: String, val age: Int) val user = User("Pavel", 32) val (name, age) = user println("$name ma $age lat") // Pavel ma 32 lata
Kluczowe cechy:
Ile zmiennych można uzyskać poprzez deklarację destrukturyzującą?
Tyle, ile zdefiniowano metod componentN() w klasie. Dla klas danych automatycznie tworzone są dla wszystkich właściwości konstruktora głównego (do 255).
Czy destrukturyzacja działa z klasami zwykłymi (nie danymi)?
Tylko jeśli w klasie zadeklarowane są ręcznie metody componentN().
Przykład:
class Point(val x: Int, val y: Int) { operator fun component1() = x operator fun component2() = y } val (x, y) = Point(10, 20)
Czy można pomijać wartości w deklaracji destrukturyzującej?
Tak, użyj _ (znaku podkreślenia) do pominięcia zewnętrznych zmiennych.
val (_, onlyAge) = user
Negatywny przypadek
W projekcie programista próbował użyć destrukturyzacji dla zwykłej klasy bez metod componentN(), co prowadziło do błędu kompilacji, po czym dodawał je ręcznie dla bardzo dużej klasy (10+ właściwości).
Zalety:
Wady:
Pozytywny przypadek
Użycie klasy danych z ograniczoną liczbą parametrów (na przykład, Result(val data: T, val error: Throwable?)), z zwięzłą deklaracją destrukturyzującą podczas przetwarzania odpowiedzi w API.
Zalety:
Wady: