Ленивая инициализация - это функция программирования, которая должна быть у всех современных языков программирования. Однако то, как они реализуются, различается от одного к другому. Давайте сравним их между Kotlin и Swift.
Декларация
Котлин
Ленивая инициализация выполняется с помощью функции делегата by
. А lazy
на самом деле является функцией, которая принимает лямбду.
val lazyString by lazy { "Lazy string" }
Таким образом, лямбда всегда нужна в Котлине lazy
.
Быстрый
Ленивая инициализация выполняется с помощью ключевого слова lazy
в переменной. Таким образом, мы могли бы легко добавить его в объявление переменной, чтобы сделать его ленивым. Закрытие не требуется.
Примечание: закрытие в Swift аналогично Lambda в Kotlin
lazy var lazyString = “Lazy String”
Если нам нужно закрытие, мы тоже можем это сделать.
lazy var lazyString = {“Lazy String”}()
Изменчивость
Котлин
Котлин разрешает только неизменяемой переменной val
быть ленивым. Это возможно, так как значение устанавливается через делегата, а lazyString
- это просто свойство, которое устанавливается для получения с помощью функции делегата by
.
val lazyString by lazy { "Lazy string" }
Это идеально, поскольку для переменной lazy
мы хотим, чтобы она инициализировалась один раз, а не изменялась позже.
Быстрый
Swift не может иметь let
для ленивой переменной, так как let
необходимо установить значение во время инициализации. Следовательно, он должен быть изменяемым var
.
lazy var lazyString = “Lazy String”
Преимущество этого в том, что после этого переменную можно изменить, хотя я думаю, что это само по себе ограничение.
Сфера
Котлин
Лениво инициализированная переменная может быть объявлена в классе или функции. В любом месте.
Быстрый
Лениво инициализированная переменная может быть объявлена только в классе или структуре. Ограниченное.
Безопасность потоков.
Котлин
По умолчанию переменная с отложенной инициализацией Kotlin является потокобезопасной. Его использование оказывает незначительное влияние на производительность.
Если бы можно было гарантировать, что он находится в одном потоке, функцию потокобезопасности можно было бы отключить с помощью LazyThreadSafetyMode.NONE
val lazyString by lazy(LazyThreadSafetyMode.NONE)
Вы можете проверить этот блог для более подробной информации.
Быстрый
Переменная с отложенной инициализацией не является потокобезопасной.
TL;DR;
Все причины перечисленных выше различий вызваны разным подходом к реализации.
В Kotlin нет специальной lazy
языковой функции, вместо этого она выполняется функцией lazy
через by
функцию делегированного языка.
В Swift это языковая функция, где lazy
- ключевое слово. Следовательно, реализация встроена в язык.
Надеюсь, этот пост будет вам полезен. Вы можете ознакомиться с другими моими интересными темами здесь.
Следуйте за мной в medium, Twitter, Facebook или Reddit за небольшими советами и изучение Android, Kotlin и т. д., связанные темы. ~ Эли ~