Функция lazy
Функция lazy используется для ленивой инициализации
свойств класса. Значение вычисляется только при первом
обращении к свойству и затем кэшируется для последующих
обращений. Принимает лямбда-выражение, возвращающее
значение инициализации.
Импорт
import kotlin.lazy
Синтаксис
val <propertyName>: <T> by lazy { <initializer> }
val <propertyName>: <T> by lazy(mode = LazyThreadSafetyMode.<MODE>) { <initializer> }
Пример
Создадим свойство с ленивой инициализацией:
val lazyValue: String by lazy {
println("Initializing lazy value")
"Hello, World!"
}
println(lazyValue)
println(lazyValue)
Результат выполнения кода:
Initializing lazy value
String "Hello, World!"
String "Hello, World!"
Пример
Использование разных режимов потокобезопасности:
val synchronizedLazy: Int by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
println("Synchronized initialization")
42
}
val publicationLazy: List<String> by lazy(LazyThreadSafetyMode.PUBLICATION) {
println("Publication initialization")
listOf("a", "b", "c")
}
val noneLazy: Double by lazy(LazyThreadSafetyMode.NONE) {
println("None thread-safe initialization")
3.14
}
Пример
Ленивая инициализация сложного объекта:
data class User(val name: String, val age: Int)
val currentUser: User by lazy {
println("Creating user object")
User("John", 30)
}
println("Before first access")
println(currentUser.name)
println("After first access")
println(currentUser.age)
Результат выполнения кода:
Before first access
Creating user object
String "John"
After first access
Int 30
Пример
Ленивая инициализация с вычислениями:
val expensiveCalculation: Int by lazy {
var result = 0
for (i in 1..1000) {
result += i
}
println("Calculation completed")
result
}
if (true) {
println(expensiveCalculation)
}
Результат выполнения кода:
Calculation completed
Int 500500