Ключевое слово data
Ключевое слово data используется для создания класса данных,
который автоматически генерирует методы toString, equals,
hashCode и copy. Основное предназначение таких классов -
хранение данных. Все свойства, объявленные в основном конструкторе,
участвуют в генерации этих методов.
Синтаксис
data class ClassName(val property1: Type1, var property2: Type2, ...)
Пример
Создадим простой класс данных для представления пользователя:
data class User(val name: String, val age: Int, val email: String)
Пример
Автоматически генерируется метод toString:
val user = User("John", 25, "john@example.com")
println(user.toString())
Результат выполнения кода:
User(name=John, age=25, email=john@example.com)
Пример
Автоматически генерируются методы equals и hashCode:
val 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())
Результат выполнения кода:
true
false
true
Пример
Автоматически генерируется функция copy для создания копии
объекта с возможностью изменения отдельных свойств:
val original = User("John", 25, "john@example.com")
val modified = original.copy(age = 26, email = "john.new@example.com")
println(original)
println(modified)
Результат выполнения кода:
User(name=John, age=25, email=john@example.com)
User(name=John, age=26, email=john.new@example.com)
Пример
Автоматически генерируется функция деструктуризации:
val user = User("John", 25, "john@example.com")
val (name, age, email) = user
println("Name: $name, Age: $age, Email: $email")
Результат выполнения кода:
Name: John, Age: 25, Email: john@example.com
Пример
Классы данных могут содержать дополнительные методы и свойства, но они не участвуют в генерации стандартных методов:
data 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)
Результат выполнения кода:
$999.99
$899.99
Ограничения
Классы данных имеют следующие ограничения:
- Не могут быть
abstract,open,sealedилиinner - Не могут наследоваться от других классов (только от интерфейсов)
- Должны иметь хотя бы один параметр в основном конструкторе
- Все параметры основного конструктора должны быть отмечены как
valилиvar