TGViewer
Kotlin Kotlin @kotlin_lib · 2.05K subscribers
Post #676 709
Обратная сторона inline функций.

Все знают, что inline, это круто для лямбд (экономим на создании объектов). Но многие лепят это ключевое слово куда попало, думая, что это аналог static final или просто "ускоритель".

Сейчас я объясню, почему за это бьют по рукам.


🛑 Вы злоупотребляете inline. Остановитесь.

В Kotlin inline - это священная корова. Мы используем его, чтобы убрать оверхед при работе с лямбдами и получить доступ к reified.

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

1. Code Bloat (Раздувание байт-кода)
Вспомним механику: компилятор берет тело инлайн-функции и копипастит его в каждое место вызова.
Если ваша функция занимает 5 строк и вызывается 100 раз - это ок.
Если функция занимает 50 строк сложной логики и вызывается 100 раз - вы только что добавили ~5000 строк инструкций в свой classes.dex или JAR.

Это не только увеличивает размер артефакта, но и бьет по Instruction Cache процессора. Процессор любит короткий, горячий код, который влезает в кэш.

2. Нарушение инкапсуляции (Synthetic Accessors)
Это самый коварный момент.
Допустим, у вас есть inline функция внутри класса, которая обращается к private полю:


class Manager {
private var token: String = "secret"

inline fun execute(action: () -> Unit) {
println("Token: $token") // Обращение к приватному полю
action()
}
}



Что происходит под капотом?
Код функции execute вставляется в место вызова (во внешний мир). Но этот внешний код не имеет права читать private token.
Чтобы это сработало, компилятор Kotlin тихо генерирует публичный синтетический метод (акцессор): access$getToken$p(), который возвращает значение.

Фактически, ваша приватность убита. Любой Java-код в том же пакете теоретически может дернуть этот акцессор.

3. Невозможность скрыть стектрейс
При краше внутри заинлайненной функции стектрейс иногда выглядит странно, указывая на строку вызова, а не на логику внутри функции (хотя LineNumberTable старается помогать, но в сложных цепочках отлаживать это - боль).

📝 Чек-лист Сеньора:
✅ Используйте inline только если принимаете функцию-лямбду как аргумент.

✅ Используйте inline, если жизненно нужен reified.

❌ Не ставьте inline для обычных маленьких функций без лямбд (JIT сам их заинлайнит при выполнении, если посчитает нужным, не мешайте ему).

❌ Избегайте обращения к private членам внутри больших inline функций.

У кого проект худел на пару мегабайт после чистки лишних inline? Делитесь историями 👇

✍️ @kotlin_lib
  • 👍 3
  • ❤ 1
  • 👎 1
More from @kotlin_lib
  1. Aug 26, 2026🚧 Ваш Mutex тормозит корутины. Как перестать лочить и начать жить Вы пишете многопоточный…
  2. Jul 25, 2026🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.r…
  3. Jul 1, 2026🌪 Ваша дата в опасности: flatMapConcat vs Merge vs Latest Вам нужно взять поток ID-шников…
  4. Jun 24, 2026🤖 Android-приложение — это не только красивый экран. За ним стоят работа с внешним API, з…
  5. Jun 23, 2026🔮 Убийца бойлерплейта: Встречайте Context Parameters (Kotlin 2.x) Мы так привыкли к Depen…
  6. Jun 3, 2026Яндекс обновил Yandex Mobile Ads SDK для монетизации мобильных приложений — и это интересн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →