Все любят
value class (бывшие inline-классы). Обертка без оверхеда, типизация примитивов, красота. Но сеньор должен знать, когда эта магия ломается.Смотрим код:
@JvmInline
value class UserId(val id: String)
fun processUser(id: UserId) { ... } // (1)
fun <T> logItem(item: T) { ... } // (2)
val uid = UserId("101")
processUser(uid) // Всё ок, передается String
logItem(uid) // 💥 А вот тут — боксинг!
Почему?
В строке
(2) функция принимает дженерик T. JVM не знает, что там внутри value class, и вынуждена создать объект-обертку (instantiate UserId), чтобы передать его как Object.Где еще ловим боксинг?
1. Использование внутри коллекций (
List<UserId>).2. Реализация интерфейсов (
value class UserId : IEntity).3. Nullable-обертки над примитивными value-классами (
value class Code(val x: Int) -> Code?).Вывод: Используйте
value class для доменной выразительности, но не обманывайте себя, что это всегда zero-allocation. Если гонитесь за перформансом в горячих циклах, проверяйте байт-код или профайлер.✍️ @kotlin_lib
