Вызов clazz.test() выбирает метод, поэтому сначала печатается function test, затем property test internal. Лямбда свойства test и методы companion здесь не вызываются.
Разбор вывода программы с companion object в Kotlin
Вызов clazz.test() выбирает метод, поэтому сначала печатается function test, затем property test internal. Лямбда свойства test и методы companion здесь не вызываются.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой набор строк будет напечатан в консоль после запуска следующего кода.
fun main() {
val clazz = TestClass()
clazz.test()
}
class TestClass {
val testInternal = {
println("property test internal")
}
val test = {
println("property test")
test()
}
fun test() {
println("function test")
testInternal()
fun testInternal() {
println("internal function test")
}
}
companion object {
fun test() {
println("Companion test")
}
fun testInternal() {
println("Companion test internal")
}
}
}
Ответ
Вызов clazz.test() выбирает метод, поэтому сначала печатается function test, затем property test internal. Лямбда свойства test и методы companion здесь не вызываются.
Локальная fun testInternal объявлена ниже места вызова и ещё не находится в его области видимости. Вызов разрешается к свойству-лямбде экземпляра testInternal. Само объявление локальной функции не запускает её тело. Совпадение имён свойства, метода и companion затрудняет чтение, поэтому в рабочем коде такие имена лучше развести.
Источник: kotlinlang.org.