когда использовать встроенную функцию в Котлин?

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

lock(l) { foo() } 

Вместо того, чтобы создавать объект функции для параметра и генерировать вызов, компилятор может испускать следующий код. ( Источник )

 l.lock() try { foo() } finally { l.unlock() } 

но я обнаружил, что функциональный объект, созданный kotlin для не-встроенной функции, отсутствует. Зачем?

 /**non-inline function**/ fun lock(lock: Lock, block: () -> Unit) { lock.lock(); try { block(); } finally { lock.unlock(); } } 

Предположим, вы создаете функцию более высокого порядка, которая принимает лямбда типа () -> Unit (без параметров, нет возвращаемого значения) и выполняет ее так:

 fun nonInlined(block: () -> Unit) { println("before") block() println("after") } 

В языке Java это будет означать нечто подобное (упрощенное!):

 public void nonInlined(Function block) { System.out.println("before"); block.invoke(); System.out.println("after"); } 

И когда вы называете это от Котлина …

 nonInlined { println("do something here") } 

Под капотом здесь будет создан экземпляр Function , который обертывает код внутри лямбда (опять же, это упрощается):

 nonInlined(new Function() { @Override public void invoke() { System.out.println("do something here"); } }); 

Таким образом, в принципе, вызов этой функции и передача ей лямбда всегда создадут экземпляр объекта Function .


С другой стороны, если вы используете ключевое слово inline :

 inline fun inlined(block: () -> Unit) { println("before") block() println("after") } 

Когда вы вызываете это так:

 inlined { println("do something here") } 

Никакой экземпляр Function не будет создан, вместо этого код вокруг вызова block внутри встроенной функции будет скопирован на сайт вызова, поэтому вы получите что-то вроде этого в байт-коде:

 System.out.println("before"); System.out.println("do something here"); System.out.println("after"); 

В этом случае новые экземпляры не создаются.

Intereting Posts
Плагин Kotlin выйдет из строя Android Studio Как добавить класс Kotlin в проект Android Studio? Android (Kotlin) – CookieHandler не работает с методом POST, но с GET работает Kotlin: Блокировка сопрограмм с неблокирующими ввода-выводами Предупреждение и выход из системы Kotlin / Quasar Fiber Моши в Android Kotlin – ENUM, поскольку ключ MutableMap преобразуется в String при его Ошибка связанного обслуживания с помощью «Context.startForegroundService () не вызвала ошибку Service.startForeground ()» Сгладить итератор двумерного массива в Котлине Смещение рамки OpenCV приводит только к синему Gradle не находит мои тесты с Kotlin и JUnit 5 При использовании Java / Kotlin для программирования рекомендуется использовать рекурсию хвоста или итерационную версию? Есть ли разница в производительности? ClassNotFoundException в Android-проекте только на моем ПК Как загрузить файл в Kotlin REPL Копирование файла автоматически с помощью pom Kotlin запускается в случае сбоя Android Studio «Не удалось синхронизировать Gradle: время ожидания подключения: подключитесь к журналу IDE для получения дополнительной информации (Help | Show Log)»