Шаг 139.
Основы Kotlin.
Объявление классов. Видимость свойств

    На этом шаге мы рассмотрим возможность изменения видимости свойств.

    Свойства отличаются от локальных переменных, объявленных внутри функции. Свойства определяются на уровне класса. Поэтому они могут быть доступны другим классам, если область видимости позволяет. Слишком широкая доступность свойства может вызвать проблемы: имея доступ к данным класса Player, другие классы смогут внести изменения в экземпляр класса Player.

    Свойства управляют чтением и записью данных через методы свойств. Все свойства имеют методы чтения, а все var-свойства имеют методы записи, - вне зависимости от того, объявляете вы для них свое поведение или нет. По умолчанию область видимости методов свойств совпадает с областью видимости самих свойств. То есть если свойство объявлено как общедоступное, его методы тоже будут общедоступными.

    А что если вы решите открыть доступ к свойству для чтения и закрыть для записи? Объявите область видимости метода записи отдельно. Сделайте метод записи для свойства name приватным.

class Player {
    var name = "madrigal"
        get() = field.capitalize()
        private set(value) {
            field = value.trim()
        }

    fun castFireball(numFireballs: Int = 2) =
            println("A glass of Fireball springs into existence. (x$numFireballs)")
}
Файл с проектом можно взять здесь.


Рис.1. Скрытие имени сеттера (Player.kt)

    Теперь name будет доступно для чтения из любой части NyetHack, но изменить его сможет только сам экземпляр Player. Эта техника весьма полезна, когда требуется запретить изменение свойства другими частями вашего приложения.

    Область видимости методов свойства не может быть шире области видимости самого свойства. Можно ограничить доступ к свойству, определив более узкую область видимости методов чтения, но нельзя присвоить методам свойства более широкую область видимости, чем объявлена для самого свойства.

    Запомните, что свойства должны инициализироваться при объявлении. Это правило особенно важно для класса с общедоступными свойствами. Если на экземпляр класса Player ссылается какой-то код в приложении, этот код должен быть уверен, что при обращении к Player.name это свойство будет хранить действительное значение.

    На следующем шаге мы рассмотрим вычисляемые свойства.




Предыдущий шаг Содержание Следующий шаг