Функция copy

Функция copy автоматически генерируется компилятором Kotlin для всех data-классов. Она позволяет создавать копию существующего объекта с возможностью изменения значений отдельных свойств. При этом исходный объект остается неизменным.

Синтаксис

kotlinfun copy(
  prop1: Type1 = this.prop1,
  prop2: Type2 = this.prop2,
  ...
  propN: TypeN = this.propN
): ClassName

Пример

Создадим data-класс User и используем функцию copy для создания копии с изменением одного свойства:

kotlindata 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)

Результат выполнения кода:

kotlinUser(name=John, age=25, email=john@example.com)
User(name=John, age=30, email=john@example.com)

Пример

Изменим несколько свойств одновременно с помощью функции copy:

kotlindata 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)

Результат выполнения кода:

kotlinProduct(id=1, name=Laptop, price=999.99, category=Electronics)
Product(id=1, name=Laptop, price=899.99, category=Sale)

Пример

Создание полной копии объекта без изменения свойств:

kotlindata 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}")

Результат выполнения кода:

kotlinOriginal: Point(x=10, y=20)
Copy: Point(x=10, y=20)
Are equal: true
Are same object: false

Пример

Использование функции copy для создания модифицированных копий в цепочке вызовов:

kotlindata 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)

Результат выполнения кода:

kotlinConfig(host=api.example.com, port=443, timeout=10000, ssl=true)

Смотрите также

  • функцию equals,
    которая сравнивает объекты по содержимому
  • функцию hashCode,
    которая генерирует хэш-код для объекта
  • функцию toString,
    которая возвращает строковое представление объекта