Как задекларировать getter/setter для property?android-72

В Kotlin свойства (properties) по умолчанию имеют автоматически генерируемые getter/setter, но вы можете кастомизировать их поведение. Вот как это делается:


1. Базовое объявление свойства

Стандартное свойство с автоматическими аксессорами:

var name: String = "Default"
// Автоматически генерирует:
// get() = field
// set(value) { field = value }

2. Кастомизация getter/setter

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
    }

3. Модификаторы доступа

Вы можете изменять видимость аксессоров:

var restrictedProperty: String = "secret"
    private set  // Сеттер только внутри класса

protected val protectedGet: String
    get() = "Limited access"

4. Особые случаи

a. Отложенная инициализация:

lateinit var lateInitVar: String  // Без кастомных аксессоров

b. Делегированные свойства:

var observed: String by Delegates.observable("") {
    prop, old, new -> println("$old → $new")
}

5. Сравнение с Java

В 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));
}

Важные нюансы

  1. Backing field: Специальное поле field доступно только в аксессорах
  2. Val vs Var: Для val можно объявить только getter
  3. Оптимизация: JIT-компилятор часто инлайнит простые аксессоры
  4. Соглашения: Имена свойств должны быть существительными (не глаголами)

Резюмируем:

В Kotlin getter/setter объявляются непосредственно в теле свойства с возможностью тонкой настройки логики доступа. Это обеспечивает:

  • Консистентность данных через валидацию
  • Инкапсуляцию без boilerplate-кода
  • Гибкость в управлении доступом