Deklaracje destrukturyzacji w Kotlinie pozwalają na "rozpakowanie" obiektów na ich składowe części bezpośrednio w deklaracjach zmiennych, co sprawia, że kod jest bardziej przejrzysty i zwięzły.
Zazwyczaj destrukturyzacja działa z klasami danych i jest wspierana dla kolekcji (poprzez funkcje komponentów). Opiera się na użyciu funkcji componentN() wewnątrz klasy obiektu.
Przykład z klasą danych:
data class User(val name: String, val age: Int) val user = User("Oleg", 32) val (name, age) = user println(name) // "Oleg" println(age) // 32
Przykład dla klasy niestandardowej:
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
Szczegóły i niuanse:
for ((k, v) in map), gdzie k i v zwracają pary klucz/wartość.Pytanie: "Czy można używać destrukturyzacji dla klasy, która nie jest klasą danych, i jakie są wymogi do tego?"
Odpowiedź: Tak. Musisz ręcznie zdefiniować operatory componentN wewnątrz klasy. Klasa danych generuje je automatycznie, ale każda klasa może je dostarczyć wyraźnie.
Przykład:
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
Przypadek
W projekcie używano destrukturyzacji z Map i błędnie założono, że destrukturyzacja jest dostępna dla wszystkich kolekcji iterowalnych. W rezultacie wystąpiły błędy "Brak ComponentN", gdy dla List oczekiwano wielu komponentów, ale istniał tylko jeden, co prowadziło do awarii aplikacji.
Przypadek
W jednym module zastosowano destrukturyzację w klasach niestandardowych, ale po refaktoryzacji zapomniano dodać funkcje
componentNoperatory; w rezultacie kod został skompilowany, ale wywołałNoSuchMethodErrorw czasie działania, co zrujnowało usługę produkcyjną.
Przypadek
Klasa danych została zmodyfikowana - atrybuty zostały przestawione, ale stare deklaracje destrukturyzacji pozostały bez zmian. W rezultacie wartości zostały przypisane do niewłaściwych zmiennych, co spowodowało poważny błąd w logice biznesowej w produkcji.