В чем разница между lazy и lazyFast в kotlin? - PullRequest
2 голосов
/ 04 марта 2020

В чем разница между ленивым свойством делегата Kotlin lazy и lazyFast?. Потому что оно выглядит как один и тот же код.

  private val key: String by lazy {
        if (arguments != null && arguments?.getString(Constants.KEY) != null) {
            return@lazy arguments?.getString(Constants.KEY).toString()
        } else {
            return@lazy ""
        }
    }

 private val key: String by lazyFast {
        if (arguments != null && arguments?.getString(Constants.KEY) != null) {
            return@lazyFast arguments?.getString(Constants.KEY).toString()
        } else {
            return@lazyFast ""
        }
    }

1 Ответ

2 голосов
/ 04 марта 2020

lazy: -

  • Представляет значение с отложенной инициализацией.
  • Получает отложенное инициализированное значение текущего экземпляра Lazy. Как только значение было инициализировано, оно не должно изменяться в течение оставшейся части времени жизни этого экземпляра Lazy.
  • Создает новый экземпляр Lazy, который использует указанную функцию инициализации, и режим безопасности потока по умолчанию LazyThreadSafetyMode.SYNCHRONIZED.
  • Если при инициализации значения возникает исключение, он попытается повторно инициализировать значение при следующем доступе.

lazy возвращает объект Lazy, который обрабатывает лямбда-функцию (инициализатор), выполняющую инициализацию, немного по-другому в соответствии с режимом выполнения потока (LazyThreadSafetyMode).

public actual fun <T> lazy(mode: LazyThreadSafetyMode, initializer: ()
        -> T): Lazy<T> =
                when (mode) {
                    LazyThreadSafetyMode.SYNCHRONIZED -> SynchronizedLazyImpl(initializer)
                    LazyThreadSafetyMode.PUBLICATION -> SafePublicationLazyImpl(initializer)
                    LazyThreadSafetyMode.NONE -> UnsafeLazyImpl(initializer) 
}

lazyFast: -

  • Реализация ленивых, не поточнобезопасных. Полезно, когда вы знаете, в каком потоке вы будете выполняться, и не беспокоитесь о синхронизации.

lazyFast также возвращает объект Lazy с режимом LazyThreadSafetyMode.NONE

fun <T> lazyFast(operation: () -> T): Lazy<T> = lazy(LazyThreadSafetyMode.NONE) {
    operation()
}

LazyThreadSafetyMode.SYNCHRONIZED: -

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

LazyThreadSafetyMode.PUBLICATION: -

  • Функция инициализатора может вызываться несколько раз при одновременном доступе к неинициализированному значению экземпляра Lazy, но в качестве значения экземпляра Lazy будет использоваться только первое возвращенное значение.

LazyThreadSafetyMode.NONE: -

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