0Pricing
Kotlin Academy · Lekcja

Kopiowanie za pomocą copy() i częściowe przesłanianie

Użyj copy(), aby tworzyć zmodyfikowane instancje bez zmieniania oryginału.

Kopiowanie za pomocą copy() i częściowe przesłanianie 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.

Niemutowalne aktualizacje za pomocą copy()

copy() tworzy nową instancję data class z wybranymi zmodyfikowanymi właściwościami. Wszystkie właściwości, których nie określono, zachowują pierwotne wartości.

Podstawy copy()

Przekaż argumenty nazwane, aby nadpisać wybrane właściwości.
data class Person(val name: String, val age: Int, val city: String)
val alice = Person("Alice", 30, "Berlin")
val olderAlice = alice.copy(age = 31)
println(olderAlice)  // Person(name=Alice, age=31, city=Berlin)

Kopiowanie wielu pól

Nadpisz tyle pól, ile potrzebujesz.
data class Config(val host: String, val port: Int, val ssl: Boolean, val timeout: Int)
val prod = Config("prod.server", 443, true, 30)
val test = prod.copy(host = "test.server", port = 8080, ssl = false)
println(test)

copy nie modyfikuje oryginału

copy zawsze tworzy nowy obiekt. Oryginał pozostaje całkowicie niezmieniony.
data class Point(val x: Int, val y: Int)
val origin = Point(0, 0)
val moved = origin.copy(x = 5)
println(origin)  // Point(x=0, y=0) — unchanged
println(moved)   // Point(x=5, y=0)

Pułapka płytkiej kopii

copy wykonuje płytką kopię. Mutowalne obiekty wewnątrz data class są współdzielone przez oryginał i kopię.
data class Team(val name: String, val members: MutableList<String>)
val t1 = Team("A", mutableListOf("Alice"))
val t2 = t1.copy(name = "B")
t2.members.add("Bob")       // modifies SHARED list!
println(t1.members)  // [Alice, Bob] ← also changed!

Unikanie problemów z płytką kopią

Używaj niemutowalnych danych wewnątrz data class, aby uniknąć problemów ze współdzieleniem.
data class Team(val name: String, val members: List<String>)  // immutable list
val t1 = Team("A", listOf("Alice"))
val t2 = t1.copy(name = "B", members = t1.members + "Bob")
println(t1.members)  // [Alice]
println(t2.members)  // [Alice, Bob]

copy w zarządzaniu stanem

copy to idiomatyczny sposób aktualizowania stanu w architekturach w stylu Redux lub MVI.
data class UiState(val loading: Boolean, val items: List<String>, val error: String?)
fun reduce(state: UiState, action: Action) = when (action) {
    is Loading -> state.copy(loading = true)
    is Success -> state.copy(loading = false, items = action.data)
    is Error -> state.copy(loading = false, error = action.msg)
}

copy z parametrami domyślnymi

Data class z wieloma właściwościami nadal oferuje wygodne copy dzięki argumentom nazwanym.
data class Article(
    val id: Long, val title: String, val body: String,
    val published: Boolean = false, val views: Int = 0
)
val draft = Article(1L, "Hello", "Content...")
val published = draft.copy(published = true)
println(published.title)  // Hello

Używanie copy w testach

copy ułatwia tworzenie obiektów testowych — utwórz jeden obiekt bazowy i zmieniaj tylko potrzebne pola.
val baseUser = User(id = 1, name = "Test", email = "test@test.com", active = true)
val inactiveUser = baseUser.copy(active = false)
val renamed = baseUser.copy(name = "Renamed")

copy a wzorzec Builder

copy() w data class jest odpowiednikiem wzorca Builder w Kotlinie. W przypadku złożonych obiektów z wieloma opcjonalnymi polami połączenie data class i copy jest bardziej zwięzłe.
// Java Builder:
User.builder().name("A").age(30).role("admin").build()
// Kotlin:
val u = User("A", 30, "admin")  // or copy from base

Semantyka rekordów

Data class z właściwościami val zachowują się jak rekordy Java (JDK 16+) — są niemutowalne, oparte na wartościach i automatycznie reprezentowane tekstowo.
data class RGB(val r: Int, val g: Int, val b: Int)
val white = RGB(255, 255, 255)
println(white)  // RGB(r=255, g=255, b=255)

Szybkie sprawdzenie

Co dzieje się z oryginalną instancją data class po wywołaniu na niej copy()?

Podsumowanie

copy() tworzy nową instancję z nadpisanymi polami — oryginał pozostaje niezmieniony. To świetne rozwiązanie do zarządzania stanem, testów i konstrukcji w stylu Buildera. Należy uważać na płytkie kopie właściwości mutowalnych. Dalej: destrukturyzacja!

Często zadawane pytania

Czy lekcja „Kopiowanie za pomocą copy() i częściowe przesłanianie” jest bezpłatna?

Tak — pełny tekst „Kopiowanie za pomocą copy() i częściowe przesłanianie” 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 „Kopiowanie za pomocą copy() i częściowe przesłanianie”?

Użyj copy(), aby tworzyć zmodyfikowane instancje bez zmieniania oryginału. Ć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 „Kopiowanie za pomocą copy() i częściowe przesłanianie”?

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. Podstawy data class: automatycznie generowane metody
  2. Kopiowanie za pomocą copy() i częściowe przesłanianie
  3. Deklaracje destrukturyzujące z componentN
  4. Data class w kolekcjach i jako klucze map
← Powrót do Kotlin Academy