История вопроса:
В Kotlin доступ к свойствам осуществляется через методы-геттеры и сеттеры. Для достижения большей производительности разработчики добавили модификатор inline для accessors, позволяющий JVM оптимизировать вызовы при компиляции, подставляя тело get/set прямо в вызывающий код.
Проблема:
Обычные accessor-методы создаются для каждого свойства, что увеличивает накладные расходы на вызов (особенно при частом обращении к ним). Иногда разработчики используют вынос логику в отдельный get/set, но хотят избежать оверхеда вызова функции.
Решение:
Используйте модификатор inline у геттера или сеттера, если их реализация короткая и нет тяжелого кода. Это снижает накладные расходы, особенно в hot-path. Обратите внимание — инлайнинг работает только для top-level свойств и свойств в объектах-компаньонах и object-объектах, а не в обычных классах из-за принципов JVM наследования.
Пример кода:
inline var Int.asHex: String get() = Integer.toHexString(this) set(value) {} inline val String.firstUpperCase: String get() = if (isEmpty()) this else this[0].uppercase() + substring(1)
Ключевые особенности:
Можно ли использовать inline get/set с обычными класса- свойствами?
Нет, инлайнинг для геттеров и сеттеров допустим только для top-level или object (включая companion object) свойств, не для свойств внутри классов, чтобы избежать проблем с наследованием.
Доступен ли доступ к backing field (полю-поддержке) в inline accessor?
Нет, inline accessor не имеет backing field, попытка обратиться к нему вызовет ошибку компиляции.
Влияет ли inlining accessor на байткод всегда?
Инлайнинг только подсказывает компилятору возможность встроить код. JIT-копмпилятор может проигнорировать это в некоторых случаях. Кроме того, если accessor содержит тяжелую логику, получаемый эффект может быть противоположным.
В проекте большое свойство объявили inline, но в геттере обрабатывают тяжелое преобразование, используемое в цикле. Итог — раздувается итоговый байткод, JIT выключает инлайнинг, падает производительность.
Плюсы:
Минусы:
Объявили inline val для конвертации числа в строку. Геттер вызывается часто в UI-коде. Производительность осталась высокой, байткод компактный.
Плюсы:
Минусы: