Inline-функции в Kotlin определяются с помощью ключевого слова inline и инструктируют компилятор "подставлять" тело функции непосредственно в места её вызова. Это снижает расходы на вызов функции, особенно когда используются лямбды или короткие функции, и устраняет аллокацию дополнительных объектов для захвата замыканий.
Пример:
def inline fun synchronized(lock: Any, block: () -> Unit) { kotlin.synchronized(lock) { block() } }
Главные плюсы:
Минусы:
Рекомендация: Используйте inline, когда нужно повысить производительность на критических участках кода, где активно используются лямбды.
Какое ограничение существует для inline-функций при работе с reified типами аргументов?
Nеправильный ответ часто: "Реализуемые типы доступны всегда внутри любого inline-функции."
Правильный ответ: Только inline-функции могут использовать модификатор reified в объявлении дженериков, позволяя обращаться к типу в рантайме:
inline fun <reified T> getTypeName() = T::class.java.name
В обычной generic-функции доступа к типу T во время исполнения не будет.
История
Плохо используемый inline привёл к раздутому APK: В команде Android-проекта программисты пометили десятки утилитарных функций как inline, включая функции с большими сложными телами. Итог — размер APK вырос почти на 2 МБ из-за дублирования функций во всех местах вызова.
История
Ошибка с лямбдами и доступом к приватным переменным: Использовали inline-функцию с лямбдой, внутри которой обращались к приватным членам класса. После перемещения функции в внешний модуль код перестал собираться (privileges нарушены), что обнаружили только на CI.
История
Использование reified вне inline-функции: Один из разработчиков попытался объявить функцию с reified generic-параметром без inline-модификатора. Код не компилировался, что вызвало долгое расследование новичком, почему "T::class" недоступно за пределами inline-функций.