data class w Kotlin — co to jest, składnia i cechy klas danych

Autor: IT Sectr Opublikowano: 2026-06-20 Czas czytania: 10 min

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 — słowo kluczowe do deklaracji klasy danych w Kotlin
  • equals i hashCode — generowane automatycznie na podstawie wszystkich właściwości primary constructor
  • copy — funkcja płytkiego kopiowania z możliwością zastąpienia poszczególnych pól
  • componentN — destrukturyzacja data class na oddzielne zmienne
  • Primary constructor musi zawierać co najmniej jeden val lub var parametr

Czym jest data class w Kotlin?

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.

Składnia i główne możliwości

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.

kotlin
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.

Właściwości poza primary constructor

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.

kotlin
data class Product(
    val id: Int,
    val title: String
) {
    var cachedPrice: Double = 0.0
    // cachedPrice NIE jest uwzględniany w equals/hashCode/copy
}

Ograniczenia primary constructor

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.

Automatyczne metody equals, hashCode i toString

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.

equals do porównywania wartości

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.

kotlin
data class Address(
    val city: String,
    val street: String
)

val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2)  // prawda

toString do debugowania

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.

Funkcja copy i destrukturyzacja

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.

kotlin
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.

Destrukturyzacja przez componentN

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.

kotlin
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.

Ograniczenia i zalecenia

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

Czy data class może dziedziczyć inny data class?

Nie, data class nie może dziedziczyć innego data class. Może jednak dziedziczyć zwykłą klasę lub implementować interfejsy.

Ile właściwości musi być w primary constructor?

Minimum jedna właściwość. Maksymalna liczba nie jest ograniczona, ale dla destrukturyzacji generowanych jest do componentN.

Czy właściwości z ciała klasy wchodzą w skład equals?

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.

Czy można ręcznie nadpisać automatyczne metody?

Tak, możesz nadpisać equals, hashCode lub toString w ciele data class. W takim przypadku kompilator nie generuje własnej implementacji.

Czym data class różni się od zwykłej klasy?

data class automatycznie generuje equals, hashCode, toString, copy i componentN. Zwykła klasa nie udostępnia tych metod bez ręcznej implementacji.

Podsumowanie

  • data class — konstrukcja składniowa Kotlin do przechowywania danych z auto-generacją metod
  • equals i hashCode — porównanie strukturalne na podstawie właściwości primary constructor
  • toString — czytelna reprezentacja obiektu do debugowania i logowania
  • copy — płytkie kopiowanie z zastąpieniem poszczególnych pól przez nazwane argumenty
  • componentN — destrukturyzacja obiektów na zmienne dla wygodnej pracy z kolekcjami
  • Ograniczenia — final domyślnie, minimum jedna właściwość, brak dziedziczenia data->data
  • Zastosowanie — DTO, modele API, value objects, stan w MVVM

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.

Omów projekt

Przeczytaj również