Sobes.tech
Junior

Jak działają klasy danych w Kotlinie?

sobes.tech AI

Odpowiedź od AI

Klasy danych w Kotlinie służą do przechowywania danych. Kompilator automatycznie generuje dla nich metody standardowe:

  • equals(): Porównuje instancje na podstawie wartości ich właściwości.
  • hashCode(): Generuje kod hash na podstawie wartości właściwości.
  • toString(): Zwraca reprezentację tekstową zawierającą nazwy i wartości wszystkich właściwości.
  • copy(): Tworzy kopię obiektu, ewentualnie zmieniając wartości wskazanych właściwości.
  • componentN(): Metody do destrukturyzacji (rozbicia obiektu na poszczególne właściwości).
// Przykład klasy danych
data class User(val name: String, val age: Int)

fun main() {
    val user1 = User("Alice", 30)
    val user2 = User("Alice", 30)
    val user3 = User("Bob", 25)

    // equals()
    println(user1 == user2) // true
    println(user1 == user3) // false

    // toString()
    println(user1.toString()) // User(name=Alice, age=30)

    // copy()
    val user4 = user1.copy(age = 31)
    println(user4) // User(name=Alice, age=31)

    // componentN() i destrukturyzacja
    val (name, age) = user1
    println("Nazwa: $name, Wiek: $age") // Nazwa: Alice, Wiek: 30
}

Kluczowe punkty:

  • Wszystkie właściwości zdefiniowane w głównym konstruktorze muszą być val lub var.
  • Klasa danych nie może być abstract, open, sealed lub inner.
  • Klasy danych mogą dziedziczyć po innych klasach lub implementować interfejsy.
  • Właściwości zadeklarowane poza głównym konstruktorem nie uczestniczą w generowaniu metod standardowych.
Metoda Opis
equals() Porównuje właściwości głównego konstruktora.
hashCode() Generuje hash na podstawie właściwości głównego konstruktora.
toString() Wyświetla tekstową reprezentację właściwości głównego konstruktora.
copy() Tworzy płytką kopię z możliwością modyfikacji właściwości.
componentN() Dostęp do właściwości w kolejności ich deklaracji w konstruktorze.

Klasy danych znacznie upraszczają pracę z POJO (Plain Old Java Object) lub DTO (Data Transfer Object), redukując kod boilerplate.