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)
  1. Для чего нужен value class в Kotlin?

    Создает легковесную обертку для значений, обеспечивая безопасность типов и оптимизацию памяти без создания объектов в куче. Это полезно для представления простых значений с дополнительной семантикой.

  1. Какие ограничения есть у value class?

    Не могут содержать изменяемые свойства.

    Не могут наследоваться.

    Не могут иметь родительские классы (только Any).

    Не могут содержать другие value class в качестве свойств.

    Не могут иметь параметры конструктора, кроме единственного значения.

  1. Сколько полей можно положить в конструктор value-класса?

    Одно.

  1. Как value class влияет на производительность и использование памяти?

    Улучшает производительность и снижает использование памяти, избегая создания объектов в куче и позволяя компилятору оптимизировать использование значений. Это уменьшает накладные расходы и нагрузку на память.

  1. Приведи пример value-класса из Compose?

    Color

    Dp