Что такое Value Class

Ответ

Value Class — это класс в Kotlin, помеченный аннотацией @JvmInline, который оборачивает одно значение, оптимизируя его хранение (избегая аллокации объекта). Используется для повышения безопасности типов без накладных расходов.

Пример:

@JvmInline
value class Password(val value: String)

fun login(password: Password) { ... }

// Использование (на уровне байт-кода — обычная String)
login(Password("secret123"))

Особенности:

  • Может содержать только один параметр в конструкторе
  • Не может быть null (используйте value class? для nullable)
  • Разворачивается в runtime (как примитивы в Java)
  • Может иметь методы, но не свойства-состояния

Ответ 18+ 🔞

Э, слушай, вот есть в Котлине такая штука — Value Class. Ну, в смысле, не просто класс, а такой, блядь, замудрённый, с аннотацией @JvmInline. Суть в чём, ёпта? Берёшь ты одно значение — строку там, число — и заворачиваешь его в свой тип, для безопасности, понимаешь? Чтобы String пароля не путать с String имени пользователя. Но при этом, охуенно же, на уровне байт-кода никакой лишней аллокации объекта нет! Оно разворачивается обратно в примитив. Гениально, да? Вообще красота.

Вот смотри, как это выглядит, реальный пример:

@JvmInline
value class Password(val value: String)

fun login(password: Password) { ... }

// Использование (на уровне байт-кода — обычная String)
login(Password("secret123"))

Видишь? Создаёшь ты Password, а внутри у него одна-единственная value. И когда ты это в функцию передаёшь, то в рантайме это будет просто строка "secret123", без всякого лишнего объекта. Производительность на высоте, а типобезопасность — вообще огонь.

Но тут, конечно, есть свои приколы, куда ж без них. Запомни раз и навсегда:

  • Только один параметр в конструкторе. Никаких вторых свойств-состояний! Одно значение — и всё, пиши пропало. Хочешь больше — делай обычный data class и страдай с аллокациями.
  • Не может быть просто так null. Сам по себе — нет. Но если очень хочется, то можно объявить как nullable: value class?. Тогда да, тогда можно запихнуть туда null, ядрёна вошь.
  • В рантайме оно разворачивается. Это главная фишка, ради чего всё и затевалось. Как примитивы в Java.
  • Методы иметь может, а вот свойства-состояния — нет. То есть геттеры-сеттеры для этого единственного значения — пожалуйста. А вот объявить внутри ещё одно var status — ни хуя себе, так нельзя, компилятор тебя выебать наизнанку попытается.

В общем, штука мощная, когда нужно и безопасность типов повысить, и по перфомансу не промахнуться. Используй на здоровье, только головой думай, э бошка думай, где это реально нужно.