Делегат 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.