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
:
lateinit
vs lazy
:
lateinit
: Переменная с модификатором lateinit
должна быть инициализирована до ее первого использования. Использование переменной до инициализации вызовет исключение UninitializedPropertyAccessException
.lazy
: Переменная с использованием lazy
инициализируется при первом обращении к ней. Это ленивая инициализация, и значение переменной будет вычислено только при первом использовании, а затем кэшируется.Параметры для lazy
: Функция lazy
принимает лямбда-выражение в качестве аргумента, которое возвращает значение, которое должно быть вычислено при первом обращении к переменной. Кроме того, lazy
принимает параметр LazyThreadSafetyMode
, который определяет режим безопасности потоков для доступа к значению переменной. Возможные значения:
SYNCHRONIZED
: Гарантирует, что значение переменной будет вычислено только один раз, и предоставляет безопасный доступ к этому значению из нескольких потоков.PUBLICATION
: Также гарантирует, что значение переменной будет вычислено только один раз, но не предоставляет безопасного доступа к этому значению из нескольких потоков.NONE
: Не предоставляет никакой защиты от нескольких потоков при доступе к значению переменной.