В Kotlin свойства (properties) по умолчанию имеют автоматически генерируемые getter/setter, но вы можете кастомизировать их поведение. Вот как это делается:
Стандартное свойство с автоматическими аксессорами:
var name: String = "Default"
// Автоматически генерирует:
// get() = field
// set(value) { field = value }
a. Пользовательский getter:
val isEmpty: Boolean
get() = this.size == 0 // Вычисляемое свойство (не хранит значение)
b. Пользовательский setter:
var text: String = ""
set(value) {
field = value.trim() // Модифицируем значение перед сохранением
}
c. Полный контроль с backing field:
var counter: Int = 0
get() {
println("Read $field")
return field
}
set(value) {
println("Update $field → $value")
field = if (value >= 0) value else 0
}
Вы можете изменять видимость аксессоров:
var restrictedProperty: String = "secret"
private set // Сеттер только внутри класса
protected val protectedGet: String
get() = "Limited access"
a. Отложенная инициализация:
lateinit var lateInitVar: String // Без кастомных аксессоров
b. Делегированные свойства:
var observed: String by Delegates.observable("") {
prop, old, new -> println("$old → $new")
}
В Kotlin (1 свойство):
var temperature: Int = 0
get() = field.coerceIn(-273..1000)
set(value) {
field = value.coerceIn(-273..1000)
}
Эквивалент в Java (2 метода):
private int temperature = 0;
public int getTemperature() {
return Math.max(-273, Math.min(temperature, 1000));
}
public void setTemperature(int value) {
this.temperature = Math.max(-273, Math.min(value, 1000));
}
field
доступно только в аксессорахval
можно объявить только getterВ Kotlin getter/setter объявляются непосредственно в теле свойства с возможностью тонкой настройки логики доступа. Это обеспечивает: