Разкажете за инициализаторите в класовете на езика Kotlin.
sobes.tech AI
Отговор от AI
В Kotlin класовете могат да имат първичен и един или повече вторични конструктори. Инициализаторите са блокове от код init, които се изпълняват в реда си след тяхното обявяване, или след първичния конструктор (ако има), или след вторичния конструктор, ако първичен няма.
Първичен конструктор
Декларира се директно в заглавието на класа. Може да съдържа параметри, които се използват за инициализация на свойствата.
class User(name: String, age: Int) {
init {
// Този блок се изпълнява при създаване на екземпляр на класа
println("Потребител създаден: $name, $age")
}
}
Вторични конструктори
Декларират се с ключовата дума constructor и винаги трябва да делегират извикването към друг конструктор на същия клас, било към първичния (чрез this), или към друг вторичен.
class User {
init {
// Този блок се изпълнява първи, ако има първичен конструктор
}
constructor(name: String) : this() {
// Вторичен конструктор 1
println("Потребител създаден с име: $name")
}
constructor(name: String, age: Int) : this(name) {
// Вторичен конструктор 2, извиква първия вторичен
println("Потребител създаден с име и възраст: $name, $age")
}
}
Подредба на изпълнение
- Кодът в първичния конструктор (ако има параметри, те се използват).
- Блоковете
initв последователност. - Кодът в извикания вторичен конструктор (след делегирането).
Пример за подредба:
class Example {
init {
println("Init блок 1")
}
constructor(i: Int) {
println("Вторичен конструктор $i")
}
init {
println("Init блок 2")
}
}
fun main() {
Example(10)
}
Изход:
Init блок 1
Init блок 2
Вторичен конструктор 10
Дори ако се извика вторичен конструктор, блоковете init винаги се изпълняват преди неговото тяло. Това гарантира, че основната инициализация на обекта е завършена преди изпълнението на специфичния код на вторичния конструктор.
Инициализаторите са незаменими за изпълнение на логика, която трябва да бъде изпълнена при създаването на всеки екземпляр на класа, независимо кой конструктор се използва. Например, за проверка на входните данни или настройка на състоянието на обекта.