Прямые ссылки на публичные уроки для быстрого старта и стабильной индексации lesson-страниц.
Модификаторы доступа — ключевые слова, с помощью которых устанавливается уровень видимости для класса, переменной или метода. Ограничение или расширение видимости данных необходимо для правильного проектирования архитектуры программы и соблюдения принципов ООП, в том числе инкапсуляции.
Основные модификаторы доступа:
publicprivateprotectedinternalВ Kotlin этот модификатор применяется по умолчанию для всех классов, методов и переменных. Все данные будут публичными, если не указывать никакой модификатор. Доступ к ним возможен из любого места проекта — из любого класса или пакета.
Данные с этим модификатором доступны только в рамках файла, в котором объявлены. Либо только в рамках класса, если данные помечены как приватные внутри него.
Данные с этим модификатором видны в классе, в котором они определены, и в классах-наследниках.
Данные с этим модификатором доступны в любой части модуля, в котором они определены. Модули рассматриваются в уроках по Android, поэтому примеров здесь не будет.
Рассмотрим модификаторы на примере класса путеводителя для путешествующих автостопом по Галактике.
class HitchhikersGuide()
Без явного указания модификатора класс, его поля и методы становятся публичными:
class HitchhikersGuide() { val title = "" fun chooseArticle() { println("Open catalog") } }
Все публичные члены класса доступны из любого места:
fun main() { val guide = HitchhikersGuide() guide.title = "Don't panic" guide.chooseArticle() }
Модификатор private ограничивает доступ до уровня класса. Если пометить title или chooseArticle() как private, обращение к ним из рабочего файла вызовет ошибку компиляции. Приватным можно объявить и весь класс — тогда создание его экземпляров станет невозможным.
Переменная, объявленная вне классов в файле с модификатором private, доступна во всём этом файле, но не видна за его пределами.
Пример вспомогательного класса Support в том же файле, что и HitchhikersGuide:
class Support { fun printInfo() { println(HitchhikersGuide::class.simpleName) println(HitchhikersGuide().title) println(supportInfo) } }
Метод chooseArticle() здесь недоступен — его область видимости ограничена классом HitchhikersGuide. Переменная supportInfo, объявленная вне классов как private, видна в этом файле, но недоступна в рабочем файле.
Инкапсуляция — это упаковка данных и функций для работы с ними внутри общего компонента. Этот механизм исключает прямой доступ извне к внутренним атрибутам класса и защищает логику компонента от случайного нарушения.
Для непрямого доступа к приватным данным используются публичные методы. Добавим приватное поле numberOfPages и публичный метод getNumberOfPages():
class HitchhikersGuide() { var title = "Don't panic" private val numberOfPages = 9999 private fun chooseArticle() { println("Open catalog") } fun getNumberOfPages() = numberOfPages }
val guide = HitchhikersGuide() println(guide.getNumberOfPages())
Аналогично можно задавать значения полю через отдельный метод, не открывая прямой доступ к переменной:
class HitchhikersGuide() { var title = "Don't panic" private var numberOfPages = 9999 private fun chooseArticle() { println("Open catalog") } fun getNumberOfPages() = numberOfPages fun setNumberOfPages(number: Int) { numberOfPages = number } }
val guide = HitchhikersGuide() println(guide.getNumberOfPages()) guide.setNumberOfPages(4200) println(guide.getNumberOfPages())
Вся реализация скрыта за публичными методами. Это позволяет изменять внутреннее устройство класса, не затрагивая внешний интерфейс и не рискуя сломать логику в других частях программы. В Kotlin роль таких методов выполняют в том числе свойства — это тема следующего урока о геттерах и сеттерах.