Kotlin Academy · Урок

Пользовательские геттеры и сеттеры с field

Пишите вычисляемые свойства и пользовательские сеттеры с помощью ключевого слова резервного поля.

Урок 3 из 413 шагов

«Пользовательские геттеры и сеттеры с field» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.

Свойства — это не просто поля

Для каждого свойства Kotlin автоматически создаётся геттер, а для var — ещё и сеттер. Их можно переопределить, добавив логику: проверку, ведение журнала или вычисления.

Пользовательский геттер

Переопределите get(), чтобы вычислять значение при каждом чтении.

class Circle(val radius: Double) {
    val area: Double
        get() = Math.PI * radius * radius
}
fun main() {
    val c = Circle(3.0)
    println(c.area) // ~28.27
}

Вычисляемые свойства

У вычисляемых свойств нет поля хранения — их значение вычисляется при каждом обращении.

class Rectangle(val w: Int, val h: Int) {
    val area get() = w * h
    val perimeter get() = 2 * (w + h)
}
fun main() {
    val r = Rectangle(3, 4)
    println("${r.area}, ${r.perimeter}") // 12, 14
}

Пользовательский сеттер с field

В пользовательском сеттере field обозначает поле хранения — фактическое место хранения значения.

class Temperature {
    var celsius: Double = 0.0
        set(value) {
            require(value >= -273.15) { "below absolute zero" }
            field = value
        }
}
fun main() {
    val t = Temperature()
    t.celsius = 25.0
    println(t.celsius)
    // t.celsius = -300.0 // throws
}

Поле хранения создаётся автоматически

Если геттер или сеттер использует field, Kotlin создаёт поле хранения. Если ни один из них его не использует, поле не создаётся — свойство вычисляется полностью.

class Counter {
    var count: Int = 0
        set(value) {
            println("Setting count from $field to $value")
            field = value
        }
}
fun main() {
    val c = Counter()
    c.count = 5
    c.count = 10
}

Сеттер с побочными эффектами

Используйте пользовательские сеттеры для ведения журнала, уведомления об изменениях или синхронизации связанного состояния.

class Brightness {
    var level: Int = 50
        set(value) {
            val clamped = value.coerceIn(0, 100)
            println("Brightness -> $clamped")
            field = clamped
        }
}
fun main() {
    val b = Brightness()
    b.level = 75
    b.level = 150 // clamps to 100
    println(b.level)
}

Закрытый сеттер

Объявите сеттер как private, чтобы предоставить интерфейс только для чтения, сохранив возможность внутренних изменений.

class Score {
    var value: Int = 0
        private set
    fun increment() { value++ }
    fun reset() { value = 0 }
}
fun main() {
    val s = Score()
    s.increment(); s.increment()
    println(s.value) // 2
    // s.value = 100 // ERROR: setter is private
}

Проверка в сеттере

Пользовательские сеттеры — естественное место для проверки входных данных.

class Email {
    var address: String = ""
        set(value) {
            require(value.contains("@")) { "invalid email" }
            field = value
        }
}
fun main() {
    val e = Email()
    e.address = "ada@example.com"
    println(e.address)
}

Геттер с логикой

Геттеры могут преобразовывать сохранённое состояние, например форматировать сохранённое значение или применять значение по умолчанию.

class Profile(_name: String?) {
    var rawName: String? = _name
    val displayName: String
        get() = rawName ?: "(unset)"
}
fun main() {
    val p = Profile(null)
    println(p.displayName) // (unset)
}

Сравнение val и var

У свойств val есть только геттер, без сеттера; у свойств var есть оба.

class Box {
    val readOnly: Int get() = 42
    var readWrite: Int = 0
}
fun main() {
    println(Box().readOnly)
    val b = Box(); b.readWrite = 5; println(b.readWrite)
}

Распространённая ошибка: рекурсия

Не используйте имя свойства внутри собственного аксессора — это вызывает бесконечную рекурсию. Вместо этого используйте field.

class Wrong {
    var x: Int = 0
        set(value) {
            // x = value // INFINITE RECURSION — calls setter again
            field = value // CORRECT
        }
}
fun main() {
    val w = Wrong(); w.x = 42; println(w.x)
}

Быстрая проверка

На что ссылается идентификатор field внутри пользовательского сеттера?

Повторение

Переопределяйте get() и set(), чтобы добавлять логику при доступе к свойству. Используйте field внутри аксессоров для чтения и записи резервного поля. Помечайте сеттеры как private для создания общедоступных API, доступных только для чтения; используйте вычисляемые свойства без резервного поля, если значение всегда вычисляется.

Можно начать бесплатно

Изучай Kotlin с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

Часто задаваемые вопросы

Урок «Пользовательские геттеры и сеттеры с field» бесплатный?

Да — полный текст урока «Пользовательские геттеры и сеттеры с field» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.

Чему я научусь в уроке «Пользовательские геттеры и сеттеры с field»?

Пишите вычисляемые свойства и пользовательские сеттеры с помощью ключевого слова резервного поля. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Kotlin Academy?

Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Пользовательские геттеры и сеттеры с field»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Kotlin Academy?

Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Первичный конструктор и параметры-свойства
  2. Блоки init и порядок инициализации
  3. Пользовательские геттеры и сеттеры с field
  4. lateinit и отложенная инициализация
← Назад к Kotlin Academy