Первичный конструктор и параметры-свойства
Объявляйте классы с первичными конструкторами и встроенными объявлениями свойств.
«Первичный конструктор и параметры-свойства» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Основной конструктор
Класс Kotlin объявляет свой основной конструктор сразу после имени класса, в круглых скобках. Тела метода нет — только список параметров.
Простейший класс
Основной конструктор без модификаторов не виден после имени класса.
class Greeter(val name: String) {
fun greet() = "Hello, $name!"
}
fun main() {
println(Greeter("Ada").greet())
}Параметры-свойства
Добавьте к параметру конструктора префикс val или var, чтобы одним шагом сделать его свойством класса.
class Person(val name: String, var age: Int)
fun main() {
val p = Person("Bob", 30)
println("${p.name} is ${p.age}")
p.age = 31
println("Now ${p.age}")
}Параметры без val/var
Параметры конструктора без val/var существуют только в области конструктора: их можно использовать в блоках init или при инициализации свойств, но нельзя получить к ним доступ позже.
class Logger(prefix: String) {
val msg = "$prefix: ready"
}
fun main() {
val l = Logger("[INFO]")
println(l.msg)
// l.prefix // ERROR — not a property
}Значения параметров по умолчанию
Задавайте значения по умолчанию для параметров конструктора, чтобы избежать шаблонного кода перегруженных вариантов.
class User(
val name: String,
val age: Int = 0,
val email: String = ""
)
fun main() {
println(User("Ana").age) // 0
println(User("Ben", 25).email) // ""
println(User("Cal", 30, "c@x.io").email)
}Именованные аргументы
Откажитесь от позиционного порядка и указывайте имена параметров при вызове — особенно удобно при наличии значений по умолчанию.
class HttpClient(
val baseUrl: String,
val timeoutMs: Int = 5000,
val retries: Int = 3
)
fun main() {
val c = HttpClient(
baseUrl = "https://api.example.com",
retries = 5
)
println("retries=${c.retries} timeout=${c.timeoutMs}")
}Видимость конструктора
Используйте private constructor, чтобы запретить создание экземпляров извне — это часто применяют вместе с фабричными методами.
class Singleton private constructor() {
companion object {
val instance = Singleton()
}
}
fun main() {
val s = Singleton.instance
println(s)
}Вторичные конструкторы
Добавляйте дополнительные конструкторы с помощью ключевого слова constructor. Они должны делегировать вызов основному конструктору через this(...).
class Point(val x: Int, val y: Int) {
constructor(value: Int) : this(value, value)
}
fun main() {
println("${Point(3).x}, ${Point(3).y}") // 3, 3
}Конструктор с указанием видимости
Для каждого конструктора можно задать свою видимость — это удобно в библиотеках.
class Lib internal constructor(val key: String) {
companion object {
fun create(key: String) = Lib(key)
}
}
fun main() {
println(Lib.create("abc").key)
}Повторение блока инициализации
Код, который должен выполняться во время создания объекта, помещается в блок init { }. Несколько блоков init выполняются в порядке следования в исходном коде.
class Validator(val value: String) {
init { require(value.isNotBlank()) { "value cannot be blank" } }
}
fun main() {
println(Validator("ok").value)
// Validator("") // throws IllegalArgumentException
}Объединение свойств и логики
Объявления свойств, вторичные конструкторы и блоки init объединяются в гибкую цепочку инициализации.
class Account(
val owner: String,
initialBalance: Double = 0.0
) {
var balance: Double = initialBalance
private set
init {
require(initialBalance >= 0) { "balance must be non-negative" }
}
fun deposit(amount: Double) { balance += amount }
}
fun main() {
val a = Account("Alice", 100.0)
a.deposit(50.0)
println("${a.owner}: ${a.balance}") // Alice: 150.0
}Быстрая проверка
Что делает ключевое слово val, если оно используется в параметре основного конструктора?
Повторение
Основной конструктор находится в заголовке класса. Используйте val/var для параметров-свойств; параметры без них доступны только конструктору. Добавляйте значения по умолчанию, чтобы уменьшить количество перегруженных вариантов, а логику настройки размещайте в блоках init. Вторичные конструкторы делегируют вызов через this(...).
Часто задаваемые вопросы
Урок «Первичный конструктор и параметры-свойства» бесплатный?
Да — полный текст урока «Первичный конструктор и параметры-свойства» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «Первичный конструктор и параметры-свойства»?
Объявляйте классы с первичными конструкторами и встроенными объявлениями свойств. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Первичный конструктор и параметры-свойства»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Первичный конструктор и параметры-свойства
- Блоки init и порядок инициализации
- Пользовательские геттеры и сеттеры с field
- lateinit и отложенная инициализация