English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основы Kotlin

Flow control в Kotlin

Функции в Kotlin

Строки в Kotlin

面向对象(OOP) в Kotlin

Getter и Setter в Kotlin

В этой статье вы узнаете, как использовать getter и setter в Kotlin с помощью примера.

Прежде чем изучать getter и setter, лучше всего уже понятьКлассы и объекты Kotlin.

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

В Kotlin getter и setter являются опциональными, если они не созданы в программе, они автоматически генерируются.

Как работают getter и setter?

Следующий код на Kotlin

class Person {
    var name: String = "defaultValue"
}

Эквивалентно

class Person {
    var name: String = "defaultValue"
    // getter
    get() = field
    // setter
    set(value) {
        field = value
    }
}

При создании объекта класса Person и инициализации свойства name оно передается в параметры setter и устанавливается field в value.

val p = Person()
p.name = "jack"

Теперь, когда вы обращаетесь к свойству name объекта, поскольку код get() = field, вы получите field

println("${p.name}")

Вот пример работы:

fun main(args: Array<String>) {
    val p = Person()
    p.name = "jack"
    println("${p.name}")
}
class Person {
    var name: String = "defaultValue"
    get() = field
    set(value) {
        field = value
    }
}

При запуске программы выводится:

jack

По умолчанию, именно так работают getter и setter. Но вы можете использовать getter и setter для изменения значений свойств (изменение значений).

Пример: Изменение значений свойств

fun main(args: Array<String>) {
    val maria = Girl()
    maria.actualAge = 15
    maria.age = 15
    println("Мария: реальный возраст = ${maria.actualAge}")
    println("Мария: виртуальный возраст = ${maria.age}")
    val angela = Girl()
    angela.actualAge = 35
    angela.age = 35
    println("Ангела: реальный возраст = ${angela.actualAge}")
    println("Ангела: виртуальный возраст = ${angela.age}")
}
class Girl {
    var age: Int = 0
    get() = field
    set(value) {
        field = if (value < 18)
            18
        else if (value >= 18 && value <= 30)
            value
        else
            value-3
    }
    var actualAge: Int = 0
}

При запуске программы выводится:

Мария: Фактический возраст  = 15
Мария: Виртуальный возраст  = 18
Ангело: Фактический возраст  = 35
Ангело: Виртуальный возраст  = 32

Здесь, свойство ActialAge работает как ожидалось.

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