На обычной JVM-реализации этот пример печатает null: printName вызывается до присваивания name. Однако чтение свойства до инициализации не имеет надёжной гарантии на уровне языка.
Разбор поведения класса при инициализации – пример №1
На обычной JVM-реализации этот пример печатает null: printName вызывается до присваивания name. Однако чтение свойства до инициализации не имеет надёжной гарантии на уровне языка.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Опишите, как работает приведённый код и предскажите, какой вывод появится в консоли при его запуске.
class Cat {
val name: String
init {
printName()
name = "Murzik"
}
private fun printName() {
println(name)
}
}
fun main() {
Cat()
}
Ответ
На обычной JVM-реализации этот пример печатает null: printName вызывается до присваивания name. Однако чтение свойства до инициализации не имеет надёжной гарантии на уровне языка.
Ненулевой тип String не делает безопасным косвенное чтение ещё не присвоенного поля через метод. Исправьте порядок: сначала name = "Murzik", затем printName, либо задайте начальное значение в объявлении свойства. Не используйте такой вывод как переносимый способ получить null: спецификация рассматривает чтение до инициализации как неопределённое значение.
Источник: kotlinlang.org.