Мне не удалось найти что-либо в определении языка, которое объясняет инициализацию класса в Котлине.Что такое семантика инициализации класса Kotlin?
import java.util.Properties
fun main(args: Array<String>) {
val out = MyClass()
out.fn()
}
class MyClass {
private val a = Properties() // 1
init {
fn()
}
public fun fn() {
println("Fn called. a = $a")
}
// private val a = Properties() // 2
}
Результаты выполнения этой программы изменяются в зависимости от того, инициализировано ли свойство в (1) или (2).
Я удивлен, что заказ декларации имеет отношение к этому языку и хотел бы понять решения, стоящие за этим. Мое ожидание будет состоять в том, что свойства инициализируются перед вызовом тела конструктора.
Это не совсем правильно. Блоки 'init' содержат код, который включен в основной конструктор. В вашем примере они выполняются, потому что вторичный конструктор делегирует основному конструктору, используя синтаксис ': this (0)'. Если вторичный конструктор не делегирует основному конструктору, блоки init не будут выполняться, когда класс инициализируется с использованием этого конструктора. – yole
Hi Aga/Yole - спасибо за ваши ответы. Вероятно, я должен был сказать, что я Kotlin n00b, но это, вероятно, ясно из моего вопроса. Я думаю, что оба ваших ответа исходят из знакомства с языком. Когда я прочитал это определение Kotlin https://kotlinlang.org/docs/kotlin-docs.pdf, единственной ссылкой, которую я нашел для init, является: «Основной конструктор не может содержать никакого кода. Код инициализации может быть помещен в блоки инициализации , которые имеют префикс ключевого слова init " Однако ничего не говорится о порядке инициализации. (Что я вижу) –
@yole спасибо за разъяснение.:) – aga