Inline в Kotlin: что это и когда использовать

inline в Kotlin — это модификатор функции. Он просит компилятор подставить тело функции в место вызова. Чаще всего inline используют для функций, которые принимают lambda, чтобы уменьшить лишние объекты и вызовы

Простой пример:

inline fun measure(block: () -> Unit) {
    val start = System.currentTimeMillis()
    block()
    val end = System.currentTimeMillis()
    println("Время: ${end - start} мс")
}

fun main() {
    measure {
        println("Работаем")
    }
}

Снаружи это выглядит как обычная функция. Разница в том, как компилятор обработает вызов

Зачем нужен inline

В Kotlin функции могут принимать lambda:

fun runAction(action: () -> Unit) {
    action()
}

Это удобно, но иногда создает дополнительный объект lambda и вызов. Для маленьких часто вызываемых функций высшего порядка inline может убрать эту накладную стоимость

Именно поэтому многие стандартные функции Kotlin выглядят очень легко в коде: let, run, use, synchronized и похожие приемы активно используют идею inline

Когда inline полезен

Используйте inline, если функция:

  • маленькая;
  • принимает одну или несколько lambda;
  • часто вызывается;
  • служит оберткой над повторяющимся шаблоном.

Не нужно ставить inline на каждую функцию. Большая inline-функция может раздуть байткод, потому что ее тело будет подставляться в места вызова

noinline и crossinline

Если inline-функция принимает несколько lambda, иногда одну из них нельзя или не нужно инлайнить. Тогда используют noinline

inline fun process(
    action: () -> Unit,
    noinline logger: () -> Unit
) {
    action()
    logger()
}

crossinline нужен, когда lambda будет вызвана внутри другого объекта или Runnable, и вы хотите запретить нелокальный return

Для новичка главное понять базовую идею: inline меняет не смысл кода для читателя, а способ компиляции

Как проверить

Запустите пример с measure, убедитесь, что блок выполняется. Затем уберите inline: программа будет вести себя так же. Разница проявляется не в выводе, а в скомпилированном коде и возможностях вроде reified type parameters

Где inline часто встречается

Новичок может не писать свои inline-функции каждый день, но он постоянно пользуется ими через стандартную библиотеку. Например, когда вы пишете:

val name: String? = "Kotlin"
name?.let {
    println(it.uppercase())
}

let выглядит как обычная функция, но благодаря inline не создает лишней тяжелой обертки вокруг маленького lambda-блока. Поэтому важно не только «знать слово inline», а понимать, почему Kotlin-код с lambda может оставаться достаточно легким

Частые ошибки

Думать, что inline ускоряет любой код

Нет. Если функция большая или не принимает lambda, пользы может не быть

Использовать inline для красоты

inline — не украшение. Если нет причины, оставьте обычную функцию

Не понимать нелокальный return

В inline-lambda return может выйти из внешней функции. Это мощно, но иногда неожиданно. Если поведение странное, проверьте, не связан ли код с inline

Что почитать дальше по Kotlin

Если нужен общий маршрут по теме, откройте рубрику Kotlin. Для соседних задач пригодятся эти разборы:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x