inline class (с Kotlin 1.5 — value class) позволяет создавать обертки над примитивами без создания отдельного объекта во время выполнения. Это используется для повышения type-safety без издержек на аллокацию памяти. Под капотом такие объекты могут компилироваться в соответствующий примитив.
Пример:
@JvmInline value class UserId(val id: String) fun printUserId(userId: UserId) { println(userId.id) }
Использование inline/value классов важно для типизации идентификаторов, денег, единиц измерения и т.д.
Может ли value class иметь больше одного свойства?
Ответ: Нет. Value class может содержать только одно property в primary constructor.
Пример ошибочного кода:
@JvmInline value class Money(val amount: Int, val currency: String) // Ошибка компиляции
История
В обменнике валют применяли inline class для описания суммы и валюты. Попытались добавить два поля в value class, получили ошибку компиляции и тратили некоторое время на попытку обойти ограничение. В итоге решили сделать отдельную data class.
История
При интеграции с внешней Java-библиотекой inline class иногда преобразовывался в объект (boxing) неожиданно, что повлияло на производительность. После анализа документации заменили на обычный value object.
История
На проекте с микросервисами использовали value class как id-шники в API. Один из сервисов возвращал строку напрямую, другой — value class, что привело к сериализационному конфликту с Jackson. Исправили путем явного маппинга между id и строкой.