data class w Kotlin — to specjalny typ klasy przeznaczony wyłącznie do przechowywania danych. Kompilator automatycznie generuje metody equals, hashCode, toString, copy i componentN na podstawie właściwości określonych w primary constructor. Według dokumentacji JetBrains (2026), data class pozwala zmniejszyć ilość kodu boilerplate o 50–70% w porównaniu z odpowiednikami w Javie i stanowi podstawę dla value-objektów w projektach Kotlin.
Najważniejsze
data class — to konstrukcja składniowa Kotlin, która automatycznie generuje standardowe metody dla klas, których głównym celem jest przechowywanie danych. Przy deklaracji data class kompilator tworzy implementacje equals, hashCode, toString, copy i componentN na podstawie wszystkich właściwości z primary constructor.
W przeciwieństwie do zwykłych klas w Javie, gdzie programista musi ręcznie pisać gettery, settery, equals, hashCode i toString za pomocą IDE lub bibliotek takich jak Lombok, Kotlin zapewnia wbudowany mechanizm. To nie tylko skraca kod, ale także gwarantuje spójność — automatyczne metody zawsze odpowiadają bieżącej strukturze właściwości.
Według danych JetBrains Kotlin Survey (2025), data class jest używany w 78% projektów Kotlin, co czyni go jedną z najbardziej pożądanych możliwości języka. Jest szczególnie popularny w architekturach z DTO, modelami odpowiedzi API i obiektami stanu w MVVM.
data class jest deklarowany ze słowem kluczowym data przed class. Wszystkie właściwości uczestniczące w metodach automatycznych są określone w primary constructor.
data class User(
val id: Int,
val name: String,
val email: String
)
Jedna linia kodu zastępuje dziesiątki linii boilerplate w Javie. Kompilator generuje equals, hashCode, toString, copy i component1–component3 dla wszystkich trzech właściwości.
Automatyczne metody obejmują tylko właściwości z primary constructor. Jeśli zadeklarujesz właściwość w ciele klasy, nie uczestniczy ona w equals, hashCode, toString i copy.
data class Product(
val id: Int,
val title: String
) {
var cachedPrice: Double = 0.0
// cachedPrice NIE jest uwzględniany w equals/hashCode/copy
}
Primary constructor data class musi zawierać co najmniej jeden parametr. Wszystkie parametry muszą być oznaczone jako val lub var. Nie można używać modyfikatorów open, abstract, sealed ani inner dla data class.
equals i hashCode są generowane na podstawie wartości wszystkich właściwości z primary constructor. Dwie instancje data class są uważane za równe, jeśli wszystkie ich odpowiednie właściwości są równe.
W Javie domyślne porównanie obiektów to porównanie referencji (==). Do porównania wartości wymagane jest nadpisanie equals. Kotlin data class robi to automatycznie, umożliwiając używanie == do porównania strukturalnego.
data class Address(
val city: String,
val street: String
)
val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2) // prawda
Metoda toString zwraca czytelną reprezentację obiektu z nazwami i wartościami wszystkich właściwości. To znacznie upraszcza logowanie i debugowanie w porównaniu z Javą, gdzie domyślnie wyświetlany jest hash-kod w formacie szesnastkowym.
Według danych Kotlin Documentation (2026), toString data class ma format: “User(id=1, name=John, email=john@example.com)”. Po usunięciu właściwości z primary constructor toString aktualizuje się automatycznie — ryzyko desynchronizacji jest wykluczone.
copy — jedna z kluczowych możliwości data class. Tworzy płytką kopię obiektu z możliwością zmiany wartości określonych właściwości.
data class Order(
val id: Long,
val status: String,
val amount: Double
)
val order = Order(1L, "Pending", 299.99)
val updatedOrder = order.copy(status = "Confirmed")
// updatedOrder.id = 1L, amount = 299.99, status = “Confirmed”
copy jest niezastąpiony w stylu funkcyjnym i architekturach z niezmiennością (immutability). Zamiast mutacji istniejącego obiektu tworzona jest nowa kopia ze zmienionymi polami, co czyni kod bardziej przewidywalnym i bezpiecznym w wielowątkowych scenariuszach.
data class automatycznie generuje funkcje component1, component2 i tak dalej dla każdej właściwości w kolejności ich deklaracji. Pozwala to na destrukturyzację obiektu na zmienne.
val user = User(1, "Alice", "alice@example.com")
val (id, name, email) = user
println("$id: $name ($email)") // “1: Alicja (alicja@example.com)”
Destrukturyzacja działa również w lambdach i pętlach for-each, co czyni data class wygodnym w pracy z kolekcjami.
Pierwsze ograniczenie — data class nie obsługuje dziedziczenia od innego data class. Można dziedziczyć tylko po zwykłych klasach lub interfejsach.
Drugie — automatyczne metody obejmują tylko właściwości primary constructor. Właściwości w ciele klasy są ignorowane, co może prowadzić do nieprawidłowego equals, jeśli o tym zapomnisz.
Trzecie — data class nie może być open, abstract, sealed ani inner. Jest zawsze final.
Czwarte — dla kolekcji wewnątrz data class copy wykonuje płytkie kopiowanie. Zmiana elementów wewnątrz skopiowanej kolekcji wpłynie na oryginał.
Według danych Kotlin Best Practices (2026), data class jest optymalny dla DTO, modeli API, value objects i obiektów stanu. Dla komponentów z logiką biznesową zaleca się używanie zwykłych klas.
Często zadawane pytania
Nie, data class nie może dziedziczyć innego data class. Może jednak dziedziczyć zwykłą klasę lub implementować interfejsy.
Minimum jedna właściwość. Maksymalna liczba nie jest ograniczona, ale dla destrukturyzacji generowanych jest do componentN.
Nie, automatyczne metody uwzględniają tylko właściwości z primary constructor. Właściwości z ciała klasy nie uczestniczą w equals, hashCode, toString i copy.
Tak, możesz nadpisać equals, hashCode lub toString w ciele data class. W takim przypadku kompilator nie generuje własnej implementacji.
data class automatycznie generuje equals, hashCode, toString, copy i componentN. Zwykła klasa nie udostępnia tych metod bez ręcznej implementacji.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również