Глиф Учебники

data class — зачем нужен

Справочник · Kotlin · 1 минута чтения

data class — класс, который нужен для хранения данных: точка с координатами, пользователь, товар. Достаточно перечислить свойства, а полезные методы компилятор добавит сам:

Kotlin
class PlainPoint(val x: Int, val y: Int)

data class Point(val x: Int, val y: Int)

fun main() {
    println(Point(1, 2))
    println(Point(1, 2) == Point(1, 2))
    println(PlainPoint(1, 2) == PlainPoint(1, 2))
    val p = Point(3, 4)
    val moved = p.copy(x = 10)
    println(moved)
    val (x, y) = moved
    println(x + y)
    val set = setOf(Point(1, 2), Point(1, 2), Point(5, 5))
    println(set.size)
}
Вывод
Point(x=1, y=2)
true
false
Point(x=10, y=4)
14
2

Что добавляется:

МетодЧто даёт
toString()вывод вида Point(x=1, y=2) вместо PlainPoint@6d06d69c
equals()== сравнивает свойства: одинаковые данные — равные объекты
hashCode()одинаковые объекты считаются одним в Set и одним ключом в Map
copy()копия с изменением нужных свойств: p.copy(x = 10)
component1(), component2()…деструктуризация: val (x, y) = p

У обычного класса два объекта с одинаковыми свойствами не равны: == у него проверяет, один ли это объект. Поэтому PlainPoint(1, 2) == PlainPoint(1, 2) — false, а в множество попали бы обе точки.

Правила объявления

Методы и другие свойства в теле класса разрешены:

Kotlin
data class Product(val name: String, val price: Int) {
    fun withDiscount(percent: Int) = copy(price = price * (100 - percent) / 100)
}

fun main() {
    val p = Product("Tea", 300)
    println(p.withDiscount(10))
}
Вывод
Product(name=Tea, price=270)

Где используют

Подводные камни

Похожее в Java — record (с Java 16), но он только для неизменяемых данных и без copy. Подробнее о классах — в уроке Классы, data class и object.