Разбор поведения класса при инициализации – пример №1

На обычной JVM-реализации этот пример печатает null: printName вызывается до присваивания name. Однако чтение свойства до инициализации не имеет надёжной гарантии на уровне языка.

Короткий ответ

Что ответить на собеседовании

На обычной 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее