Что выведет код Middle Делегаты обновлено

lazy и observable: порядок вызовов

Вопрос

Что выведет код? По строке на каждый вывод.

import kotlin.properties.Delegates

class Screen {
    val heavy: String by lazy { println("init"); "data" }
    var title: String by Delegates.observable("start") { _, old, new ->
        println("$old -> $new")
    }
}

fun main() {
    val s = Screen()
    println("created")
    println(s.heavy)
    println(s.heavy)
    s.title = "home"
    s.title = "home"
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: created, init, data, data, start -> home, home -> home. Ленивое значение не вычисляется при создании объекта, init печатается при первом обращении, второй раз берётся кеш.

Что выведет

created
init
data
data
start -> home
home -> home

Разбор

Ленивое значение не вычисляется при создании объекта, init печатается при первом обращении, второй раз берётся кеш. Обработчик observable срабатывает на каждое присваивание, даже если значение не изменилось.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.