copy i equals
Generowane funkcje
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:
equalsi==porównują wartościhashCodepozostaje spójny z funkcją equalscopyklonuje 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.
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.