Inline-функции: когда и зачем
Вопрос
Объясни, что такое inline-функции, какие возможности они дают и какие есть подводные камни.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Тело функции и лямбд копируется в место вызова
Нет объекта лямбды и вызова через интерфейс
Даёт non-local return и reified
noinline и crossinline для особых случаев
Минус: раздувание кода, нет смысла без лямбд-параметров
Публичная inline-функция не может обращаться к private-членам
Что могут спросить следом
- Почему
forEachможно прервать черезreturn, а обычную функцию нет? - Что такое
@PublishedApi? - Можно ли вызвать reified-функцию из Java?
Разбор
Обычная функция, принимающая лямбду, на JVM получает объект функционального интерфейса, а если лямбда захватывает переменные, этот объект создаётся при каждом вызове. Inline-функция решает это: компилятор копирует её тело и тело лямбды прямо в место вызова, объекта нет. Поэтому map, filter, let, apply в stdlib inline. Это даёт две возможности. Non-local return: return внутри лямбды выходит из внешней функции. И reified: в месте вызова тип известен, поэтому можно писать T::class и is T. Для особых случаев есть noinline, если лямбду надо сохранить как объект, и crossinline, если её вызывают из вложенного контекста. Минусы: раздувание байткода, поэтому инлайнить стоит небольшие функции с лямбдами. Публичная inline-функция не может трогать приватные члены класса, для этого есть @PublishedApi internal. Reified-функции нельзя вызвать из Java.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.