Value Class
https://kotlinlang.org/docs/inline-classes.html |
value class
Cпециальный тип классов, предназначенный для представления небольших неизменяемых объектов, которые компилируются в примитивы (или другие оптимизированные формы) для улучшения производительности.
• Может иметь только один параметр в первичном конструкторе.
• Объекты такого класса неизменяемы (val
).
• Не может наследоваться от других классов или реализовывать интерфейсы.
@JvmInline
value class Email(val address: String)
// Пример value-класса - класс Duration для установки времени в мс. Вместо установки значения в Long где легко ошибится.
@JvmInline
value class Duration private constructor(val millis: Long) {
constructor(millis: Int): this(millis.toLong()) {
check(millis != 0)
}
init {
check(millis != 0L)
}
companion object {
fun millis(millis: Long): Duration = Duration(millis)
fun seconds(seconds: Long): Duration = Duration(seconds * 1000)
}
}
val duration: Long = Duration.seconds(2L).millis
val duration: Long = Duration.millis(1200).millis
@JvmInline
value class Id<out T>(val value: String)
data class User(val id: Id<User>)
data class Address(val id: Id<Address>)
val me = User(id = Id("test id"))
val home = Address(id = Id("test id"))
if (me.id == home.id) {} // This will not compile
Вопросы на собесе (5)
- Для чего нужен value class в Kotlin?
Создает легковесную обертку для значений, обеспечивая безопасность типов и оптимизацию памяти без создания объектов в куче. Это полезно для представления простых значений с дополнительной семантикой.
- Какие ограничения есть у value class?
• Не могут содержать изменяемые свойства.
• Не могут наследоваться.
• Не могут иметь родительские классы (только
Any
).• Не могут содержать другие
value class
в качестве свойств.• Не могут иметь параметры конструктора, кроме единственного значения.
- Сколько полей можно положить в конструктор value-класса?
Одно.
- Как value class влияет на производительность и использование памяти?
Улучшает производительность и снижает использование памяти, избегая создания объектов в куче и позволяя компилятору оптимизировать использование значений. Это уменьшает накладные расходы и нагрузку на память.
- Приведи пример value-класса из Compose?
•
Color
•
Dp