В Kotlin была введена концепция inline/value классов (сейчас называется value class), чтобы минимизировать runtime-оверход при работе с обёртками над примитивами и небольшими структурами. Идея заимствована из других языков (например, C# structs), где подобная оптимизация полезна для повышения производительности без потери типизации.
Создание классов-обёрток (например, для типов-сущностей или идентификаторов) без оптимизации приводит к появлению дополнительного объекта в памяти, что влияет на производительность, GC и может приводить к Boxing/Unboxing overhead. Часто возникает пожелание иметь строгую типизацию (например, UserId вместо Int), но без реального создания объектов.
Value class объявляется с модификатором value. В большинстве ситуаций JVM не создаёт дополнительный объект — value class заменяется своим полем напрямую (inlining). Это даёт type-safety и производительность, близкую к «просто Int».
Пример кода:
@JvmInline value class UserId(val value: Int) fun showId(id: UserId) = println(id.value) val id = UserId(15) showId(id) // Без создания отдельного объекта UserId
Ключевые особенности:
Могут ли value class иметь несколько свойств?
Нет, value class может содержать только одно свойство.
// Ошибка: // value class Money(val amount: Int, val currency: String)
Можно ли создать value class с nullable-свойством?
Поле value у value class не может быть nullable — только не-nullable типы.
// Ошибка: // value class Name(val value: String?)
Можно ли использовать наследование с value class?
Value class не поддерживает наследование и не может быть абстрактным или sealed.
// Ошибка: // value class NewId(val value: Int): BaseId()
Разработчик создал value class для сущности с двумя свойствами (например, пара Int и String), получил ошибку компиляции.
Плюсы:
Разработчик использует value class для типа-идентификатора с одним полем (например, UserId), что работает быстро и безопасно.
Плюсы: