Пользовательские геттеры и сеттеры с field
Пишите вычисляемые свойства и пользовательские сеттеры с помощью ключевого слова резервного поля.
«Пользовательские геттеры и сеттеры с 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 — локальная установка не требуется.
Все уроки этого курса
- Первичный конструктор и параметры-свойства
- Блоки init и порядок инициализации
- Пользовательские геттеры и сеттеры с field
- lateinit и отложенная инициализация