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