Назад к вопросам
Middle
193
questionbank
Что такое 'lazy' и 'lateinit' в Kotlin?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
lazy - делегат свойства для отложенной инициализации неизменяемых (read-only) свойств (val). Значение вычисляется при первом обращении к свойству и затем кэшируется.
// Пример использования lazy
val lazyValue: String by lazy {
println("Инициализация") // будет выведено только один раз при первом обращении
"Привет, lazy!"
}
lateinit - модификатор для изменяемых (mutable) свойств (var), который позволяет отложить инициализацию до момента первого доступа. Свойство должно быть не-nullable. Использование свойства до инициализации приводит к UninitializedPropertyAccessException.
// Пример использования lateinit
lateinit var lateinitVariable: String
fun initializeVariable() {
lateinitVariable = "Привет, lateinit!"
}
fun useVariable() {
// Проверка инициализации перед использованием (опционально, но рекомендуется)
if (::lateinitVariable.isInitialized) {
println(lateinitVariable)
} else {
println("Переменная еще не инициализирована")
}
}
Основные отличия:
| Особенность | lazy |
lateinit |
|---|---|---|
| Тип свойства | val (read-only) |
var (mutable) |
| Nullability | Может быть nullable или non-nullable | Должно быть non-nullable |
| Инициализация | Автоматическая, при первом доступе | Ручная |
| Отложенность | Да, вычисление при первом доступе | Да, объявление без инициализации |
| Потокобезопасность | По умолчанию потокобезопасен (синхронизация), есть опции | Не гарантируется, зависит от контекста |
| Исключение при доступе до инициализации | Нет, инициализируется автоматически | UninitializedPropertyAccessException |