Kotlin Academy · Lekcja

copy i equals

Generowane funkcje

Lekcja 2 z 413 kroki

copy i equals to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Generowane funkcje

Oprócz toString klasa danych generuje funkcje equals, hashCode i copy.

Te trzy funkcje sprawiają, że klasy danych doskonale nadają się do porównywania i klonowania.

Równość strukturalna

Generowana funkcja equals porównuje obiekty na podstawie wartości ich właściwości, a nie ich tożsamości.

Dwie instancje klasy danych o tych samych wartościach są równe przy użyciu ==.

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = User("Alice", 30)
    println(a == b)
}

Różne wartości nie są równe

Po zmianie dowolnej właściwości obiekty nie są już równe.

Równość jest obliczana na podstawie każdej właściwości konstruktora podstawowego.

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = User("Alice", 31)
    println(a == b)
}

Równość a tożsamość

Należy używać == do porównywania wartości (równości strukturalnej), a === do porównywania referencji (równości tożsamościowej).

Dwa równe obiekty danych mogą być różnymi instancjami w pamięci.

data class User(val name: String)

fun main() {
    val a = User("Alice")
    val b = User("Alice")
    println(a == b)  // values match
    println(a === b) // different instances
}

Spójny hashCode

Funkcja hashCode jest generowana tak, aby odpowiadała funkcji equals: równe obiekty generują ten sam skrót.

Dzięki temu klasy danych poprawnie działają w zbiorach i jako klucze map.

data class Point(val x: Int, val y: Int)

fun main() {
    val a = Point(1, 2)
    val b = Point(1, 2)
    println(a.hashCode() == b.hashCode())
}

Funkcja copy

Funkcja copy tworzy nowy obiekt identyczny z oryginalnym.

W przypadku niezmiennych właściwości val kopiowanie jest sposobem na utworzenie zmodyfikowanej wersji.

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = a.copy()
    println(b)
    println(a == b)
}

Kopiowanie ze zmianami

Do funkcji copy można przekazać argumenty nazwane, aby zmienić określone właściwości i zachować pozostałe.

Jest to standardowy wzorzec aktualizowania niezmiennych danych.

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val older = a.copy(age = 31)
    println(a)
    println(older)
}

Kopiowanie nie zmienia oryginału

copy nigdy nie modyfikuje obiektu źródłowego. Oryginał zachowuje swoje wartości.

Ta niezmienność sprawia, że zmiany stanu są przewidywalne i bezpieczne.

data class Account(val owner: String, val balance: Int)

fun main() {
    val original = Account("Sam", 100)
    val updated = original.copy(balance = 150)
    println(original.balance)
    println(updated.balance)
}

Łańcuchowe kopiowanie

Ponieważ copy zwraca nowy obiekt, można zastosować kilka aktualizacji po kolei.

Każdy krok tworzy nową, niezależną wartość.

data class Config(val volume: Int, val muted: Boolean)

fun main() {
    val base = Config(50, false)
    val result = base.copy(volume = 70).copy(muted = true)
    println(result)
}

Liczą się tylko właściwości konstruktora

Podobnie jak w przypadku równości, funkcja copy obsługuje tylko właściwości konstruktora podstawowego.

Właściwości ciała są w kopii przywracane do wartości domyślnych, dlatego ważny stan należy przechowywać w konstruktorze.

data class User(val name: String) {
    var note: String = "none"
}

fun main() {
    val a = User("Alice")
    a.note = "VIP"
    val b = a.copy()
    println(b.note) // back to default
}

Zastosowanie w praktyce

Generowane funkcje zapewniają klasom danych ich możliwości:

  • equals i == porównują wartości
  • hashCode pozostaje spójny z funkcją equals
  • copy klonuje obiekt, opcjonalnie wprowadzając zmiany
data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = a.copy(name = "Alicia")
    println(a == b)
    println(b)
}

Szybkie sprawdzenie

Sprawdźcie Państwo swoją wiedzę na temat funkcji copy i equals.

Podsumowanie

Poznali Państwo generowane funkcje klas danych:

  • equals porównuje wartości, == służy do porównania wartości, a === — referencji
  • hashCode zachowuje spójność na potrzeby kolekcji
  • copy klonuje obiekt, pozwalając wybiórczo zmieniać właściwości

W następnej części dowiedzą się Państwo, jak rozpakowywać obiekty do zmiennych za pomocą destrukturyzacji.

Bezpłatny start

Ucz się Kotlin dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
51
Lekcje
203

Często zadawane pytania

Czy lekcja „copy i equals” jest bezpłatna?

Tak — pełny tekst „copy i equals” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „copy i equals”?

Generowane funkcje Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?

Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „copy i equals”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?

Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Deklarowanie data class
  2. copy i equals
  3. Deklaracje destrukturyzujące
  4. Data class w kolekcjach
← Powrót do Kotlin Academy