Геттеры и сеттеры в Kotlin

Привет. Сегодня мы будем разбираться с тем, что такое геттеры и сеттеры в Kotlin. Собственно, свойства похожи на поля в Java, но есть и важные отличия. Например, свойства имеют автогенерацию getter и setter, и они не обязательно должны принадлежать классу.

Getter и Setter для свойств в Kotlin

В Kotlin свойство не обязательно должно иметь getter и setter.

var brand: String = "Ford"

Это то же самое, что и определение методов get() и set():

var brand: String = "Ford"
    get() {
        return field
    }
    set(value) {
        field = value
    }

Геттер и сеттер — это знакомый многим шаблон по Java, но в Kotlin нам не нужно создавать частное резервное поле для свойства. Мы можем использовать точечный синтаксис для вызова методов получения и установки для свойств класса:

val sedan = Vehicle()
println(sedan.brand) // выведет "Ford"
sedan.brand = "Toyota"
println(sedan.brand) // выведет "Toyota"

Теперь, когда мы немного разобрались в вопросе, давайте приступим к основной части статьи.

Доступ к значению…

Каждое определяемое нами свойство поддерживается полем, доступ к которому можно получить только в его методах get() и set() с использованием специального ключевого слова field. Ключевое слово field используется для доступа или изменения значения. Это позволяет нам определять собственную логику в методах get() и set():

var rating: Int = 5
    get() {
        if (field< 5) {
            print("Внимание: эта тачка просто хлам")
        }
        return field
    }
    set(value) {
       field = when {
           value > 10 -> 10
           value < 0 -> 0
           else -> value
       }
    }

Определение своего getter и setter в Kotlin позволяет нам выполнять такие операции со свойствами как: проверка ввода, ведение журнала или преобразование данных. Добавляя логику непосредственно в getter или setter Kotlin, мы гарантируем, что она всегда выполняется при доступе к свойству. Старайтесь максимально избегать или минимизировать сайдэффекты в setter и getter. Это затрудняет понимание кода.

Val или Var

Как многие уже знают — дабы иметь возможность изменять значение свойства, мы отмечаем его словом var. Если нам нужно неизменяемое свойство, мы отмечаем его словом val. Основное различие состоит в том, что свойства объявленные с val не могут иметь setter. Следствием определения пользовательского getter является то, что свойство val может фактически изменять свое значение.

Например, свойство isWorthCar использует свойство изменяемого рейтинга для вычисления своего значения

val isWorthCar get() = this.rating > 5

Тут свойство действует как метод при использовании пользовательского getter в Kotlin. Если нам нужно выполнить дорогостоящую или медленную операцию для вычисления свойства, было бы лучше использовать метод.

Модификаторы видимости

В Java мы часто хотим, чтобы поля класса имели открытый доступ для чтения и частный доступ для записи. Этого можно добиться с помощью public getter и private setter. Kotlin предоставляет более лаконичный способ реализации, разрешая модификаторы видимости для set() свойства

var stock: Int = 0
    private set

Теперь любые пользователи класса sedan могут читать свойство stock, но только класс Vehicle может его изменять. Обратите внимание, что по умолчанию свойства видимости являются общедоступными. Getter всегда будет иметь такую же видимость, как и само свойство, с которым он взаимодействует. Например, если свойство является частным (private), то геттер будет частным (private).

Выводы

В этом руководстве мы рассмотрели методы получения и установки свойств. Они обеспечивают лаконичную функциональность за счет дополнительных методов get() и set(). Мы должны минимизировать сайдэффекты, чтобы наш код оставался чистым и понятным.

Оставить ответ