Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktOpDlLz 108 of 123 menu
◀ ▶

Делегат lazy в Kotlin

Запись by lazy { ... } создаёт ленивое свойство: блок в фигурных скобках выполняется только при первом чтении, результат сохраняется и дальше возвращается из кэша. Для val это удобно, когда инициализация дорогая или зависит от других полей, уже заданных в конструкторе.

class Page(val id: Int) { val summary: String by lazy { println("build $id") "page-$id" } } fun main() { val p = Page(1) println(p.summary) println(p.summary) }

Строка build 1 появится один раз: второй доступ к summary не запускает блок снова.

По умолчанию lazy потокобезопасен для многопоточного доступа. В однопоточном коде можно указать LazyThreadSafetyMode.NONE внутри вызова lazy(...) { } - реже нужно на первых шагах, достаточно знать, что режим существует.

Функцию lazy применяют только к val: значение вычисляется один раз и не меняется. Для изменяемых полей с реакцией на запись смотрите observable.

Объявите class FileJob с параметром конструктора val path: String. Объявите свойство val lines: List<String> by lazy - список из одной строки "ok". Выведите длину списка два раза подряд.

Объявите class Holder с val code: Int by lazy { 100 }. Создайте объект и выведите code.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить