Ключевое слово data

Ключевое слово data используется для создания класса данных, который автоматически генерирует методы toString, equals, hashCode и copy. Основное предназначение таких классов - хранение данных. Все свойства, объявленные в основном конструкторе, участвуют в генерации этих методов.

Синтаксис

kotlindata class ClassName(val property1: Type1, var property2: Type2, ...)

Пример

Создадим простой класс данных для представления пользователя:

kotlindata class User(val name: String, val age: Int, val email: String)

Пример

Автоматически генерируется метод toString:

kotlinval user = User("John", 25, "john@example.com")
println(user.toString())

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

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

Пример

Автоматически генерируются методы equals и hashCode:

kotlinval user1 = User("John", 25, "john@example.com")
val user2 = User("John", 25, "john@example.com")
val user3 = User("Jane", 30, "jane@example.com")

println(user1 == user2)
println(user1 == user3)
println(user1.hashCode() == user2.hashCode())

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

kotlintrue
false
true

Пример

Автоматически генерируется функция copy для создания копии объекта с возможностью изменения отдельных свойств:

kotlinval original = User("John", 25, "john@example.com")
val modified = original.copy(age = 26, email = "john.new@example.com")

println(original)
println(modified)

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

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

Пример

Автоматически генерируется функция деструктуризации:

kotlinval user = User("John", 25, "john@example.com")
val (name, age, email) = user

println("Name: $name, Age: $age, Email: $email")

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

kotlinName: John, Age: 25, Email: john@example.com

Пример

Классы данных могут содержать дополнительные методы и свойства, но они не участвуют в генерации стандартных методов:

kotlindata class Product(val id: Int, val name: String, val price: Double) {
  val formattedPrice: String
    get() = "$${"%.2f".format(price)}"
  
  fun applyDiscount(discount: Double): Product {
    return this.copy(price = price * (1 - discount))
  }
}

val product = Product(1, "Laptop", 999.99)
val discounted = product.applyDiscount(0.1)

println(product.formattedPrice)
println(discounted.formattedPrice)

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

kotlin$999.99
$899.99

Ограничения

Классы данных имеют следующие ограничения:

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

  • ключевое слово class,
    для объявления обычных классов
  • ключевое слово toString,
    для строкового представления объектов
  • ключевое слово equals,
    для сравнения объектов
  • ключевое слово copy,
    для создания копий объектов