Свойства в теле data class в Kotlin
Не каждое поле data class обязано стоять
в круглых скобках после имени. Свойство можно
объявить в теле класса - тогда оно не входит
в автоматический toString, equals,
copy и функции componentN:
data class User(val name: String, val age: Int) {
var loginCount: Int = 0
}
fun main() {
val u = User("Ann", 25)
u.loginCount = 3
println(u)
}
В выводе видны только name и age -
счётчик в заголовок не попал. Для служебных
данных, которые не должны участвовать в сравнении
записей, тело класса подходит лучше, чем заголовок:
data class Item(val sku: String, val qty: Int) {
val lineTotal: Int
get() = qty * 10
}
fun main() {
val row = Item("A1", 3)
println(row.lineTotal)
println(row)
}
Вычисляемое свойство в теле можно строить
из полей заголовка - как геттер без параметров
в обычном классе. При copy меняются
только параметры конструктора; свойства тела
пересчитываются для нового объекта:
data class Box(val w: Int, val h: Int) {
val area: Int get() = w * h
}
fun main() {
val b = Box(2, 3)
val wide = b.copy(w = 5)
println(b.area)
println(wide.area)
}
Сделайте data class Product с полями
title и price. В теле добавьте
свойство label - строка из "sale: "
и значения title.
Создайте объект с title = "Pen" и
price = 5. Выведите на экран
label и результат println
для самого объекта.
Сделайте data class Segment с полями
start и end. В теле добавьте
length как разность end - start.
Создайте сегмент от 2 до 7
и выведите на экран length.