Value Class

https://kotlinlang.org/docs/inline-classes.html

value class

Это оболочка вокруг значения без накладных расходов. Может иметь только один параметр в первичном конструкторе. value-классы позволяют повысить безопасность кода с минимальным использованием шаблонного кода и обеспечив производительность. Без ключевого слова value компилятор каждый раз создает объект класса и размещает его в памяти.

// Пример value-класса - класс Duration для установки времени в мс. Вместо установки значения в Long где легко ошибится.

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 UserId(val value: String)

@JvmInline 
value class AddressId(val value: String)

data class User(val id: UserId)
data class Address(val id: AddressId)

val me = User(id = UserId("test id"))
val home = Address(id = AddressId("test id"))

if (me.id == home.id) {} // This will not compile
@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 also

Kotlin Value Class. Вопросы на собесе
  1. Что такое value class в Kotlin и какова его основная цель?
  1. Какие ограничения есть у value class?
  1. Как value class влияет на производительность и использование памяти?