Функция copy
Функция copy автоматически генерируется компилятором Kotlin
для всех data-классов. Она позволяет создавать копию существующего
объекта с возможностью изменения значений отдельных свойств.
При этом исходный объект остается неизменным.
Синтаксис
fun copy(
prop1: Type1 = this.prop1,
prop2: Type2 = this.prop2,
...
propN: TypeN = this.propN
): ClassName
Пример
Создадим data-класс User и используем функцию copy
для создания копии с изменением одного свойства:
data class User(val name: String, val age: Int, val email: String)
val user1 = User("John", 25, "john@example.com")
val user2 = user1.copy(age = 30)
println(user1)
println(user2)
Результат выполнения кода:
User(name=John, age=25, email=john@example.com)
User(name=John, age=30, email=john@example.com)
Пример
Изменим несколько свойств одновременно с помощью функции copy:
data class Product(val id: Int, val name: String, val price: Double, val category: String)
val product1 = Product(1, "Laptop", 999.99, "Electronics")
val product2 = product1.copy(price = 899.99, category = "Sale")
println(product1)
println(product2)
Результат выполнения кода:
Product(id=1, name=Laptop, price=999.99, category=Electronics)
Product(id=1, name=Laptop, price=899.99, category=Sale)
Пример
Создание полной копии объекта без изменения свойств:
data class Point(val x: Int, val y: Int)
val original = Point(10, 20)
val copy = original.copy()
println("Original: $original")
println("Copy: $copy")
println("Are equal: ${original == copy}")
println("Are same object: ${original === copy}")
Результат выполнения кода:
Original: Point(x=10, y=20)
Copy: Point(x=10, y=20)
Are equal: true
Are same object: false
Пример
Использование функции copy для создания модифицированных копий
в цепочке вызовов:
data class Config(val host: String, val port: Int, val timeout: Int, val ssl: Boolean)
val defaultConfig = Config("localhost", 8080, 5000, false)
val productionConfig = defaultConfig
.copy(host = "api.example.com")
.copy(port = 443)
.copy(ssl = true)
.copy(timeout = 10000)
println(productionConfig)
Результат выполнения кода:
Config(host=api.example.com, port=443, timeout=10000, ssl=true)