Функция lazy

Функция lazy используется для ленивой инициализации свойств класса. Значение вычисляется только при первом обращении к свойству и затем кэшируется для последующих обращений. Принимает лямбда-выражение, возвращающее значение инициализации.

Импорт

kotlinimport kotlin.lazy

Синтаксис

kotlinval <propertyName>: <T> by lazy { <initializer> }
kotlinval <propertyName>: <T> by lazy(mode = LazyThreadSafetyMode.<MODE>) { <initializer> }

Пример

Создадим свойство с ленивой инициализацией:

kotlinval lazyValue: String by lazy {
  println("Initializing lazy value")
  "Hello, World!"
}

println(lazyValue)
println(lazyValue)

Результат выполнения кода:

kotlinInitializing lazy value
String "Hello, World!"
String "Hello, World!"

Пример

Использование разных режимов потокобезопасности:

kotlinval 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
}

Пример

Ленивая инициализация сложного объекта:

kotlindata 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)

Результат выполнения кода:

kotlinBefore first access
Creating user object
String "John"
After first access
Int 30

Пример

Ленивая инициализация с вычислениями:

kotlinval expensiveCalculation: Int by lazy {
  var result = 0
  for (i in 1..1000) {
    result += i
  }
  println("Calculation completed")
  result
}

if (true) {
  println(expensiveCalculation)
}

Результат выполнения кода:

kotlinCalculation completed
Int 500500

Смотрите также

  • ключевое слово lateinit,
    которое используется для отложенной инициализации переменных
  • ключевое слово val,
    которое объявляет неизменяемое свойство
  • ключевое слово var,
    которое объявляет изменяемое свойство
  • ключевое слово class,
    которое объявляет класс