Lateinit. Lazy

Модификатор lateinit в Kotlin используется для отложенной инициализации переменных, которые не могут быть инициализированы при объявлении, но должны быть инициализированы перед их первым использованием. Этот модификатор применяется только к переменным типа var, то есть переменным с возможностью изменения значения.

class MyClass {
    lateinit var myProperty: String // Переменная, которая будет инициализирована позже

    fun initProperty() {
        myProperty = "Initialized value"
    }

    fun printProperty() {
        println(myProperty)
    }
}

fun main() {
    val obj = MyClass()
    // obj.myProperty // Ошибка компиляции: Property 'myProperty' has not been initialized yet
    obj.initProperty()
    obj.printProperty() // Вывод: Initialized value
}

Теперь о разнице между lateinit и lazy:

  1. lateinit vs lazy:

    • lateinit: Переменная с модификатором lateinit должна быть инициализирована до ее первого использования. Использование переменной до инициализации вызовет исключение UninitializedPropertyAccessException.
    • lazy: Переменная с использованием lazy инициализируется при первом обращении к ней. Это ленивая инициализация, и значение переменной будет вычислено только при первом использовании, а затем кэшируется.
  2. Параметры для lazy: Функция lazy принимает лямбда-выражение в качестве аргумента, которое возвращает значение, которое должно быть вычислено при первом обращении к переменной. Кроме того, lazy принимает параметр LazyThreadSafetyMode, который определяет режим безопасности потоков для доступа к значению переменной. Возможные значения:

    • SYNCHRONIZED: Гарантирует, что значение переменной будет вычислено только один раз, и предоставляет безопасный доступ к этому значению из нескольких потоков.
    • PUBLICATION: Также гарантирует, что значение переменной будет вычислено только один раз, но не предоставляет безопасного доступа к этому значению из нескольких потоков.
    • NONE: Не предоставляет никакой защиты от нескольких потоков при доступе к значению переменной.