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

Введение

Модификаторы видимости  —  это ключевые слова, которыми определяется уровень доступности элементов: классов, объектов, интерфейсов, конструкторов, функций, свойств и их сеттеров.

В Kotlin имеется четыре модификатора видимости. А в Java их три: недоступен internal. В Kotlin видимость по умолчанию  —  public, в Java  —  private.

1. Public доступен отовсюду.

2. Private  —  только из класса, в котором определен (даже в дочерних классах).

3. Protected  —  только в своем классе и классах, от которых унаследован.

4. Internal  —  это переменная видимости: в модуле значение делается public, а вне модуля  —  private. Применяется при написании библиотеки: значения используются в ней везде, а при переключении на другой модуль вне ее доступа к значению не желателен. Ведь, чтобы зарабатывать на библиотеке, к функциям, которые мы пишем, не должно быть прямого доступа извне.

Рассмотрим модификаторы видимости на примерах:

open class Company() {
var name = "Company" // public по умолчанию
private var androidDev = 2 // private для класса Company
protected open val iosDev = 3 // видимый для Company и класса Huawei
internal val flutterDev = 4 // виден внутри того же модуля

protected fun getSalary() { } // видимый для Company и класса Huawei
}

class Huawei: Company() {

/**
* name, iosDev, flutterDev и getSalary() класса Company видны
* androidDev не виден
*/

override val iosDev = 9 // c — protected, виден в дочернем классе
}

fun main() {
val company = Company()
/**
* company.name и company.flutterDev видны.
* company.androidDev, company.iosDev и company.getSalary() не видны
*/



val huawei = Huawei()
/**
* huawei.iosDev не виден
* huawei.name и huawei.flutterDev видны.
*/

}

В классе Company значения определены четырьмя разными модификаторами. Чтобы лучше видеть статус этих четырех значений, наследуем этот класс от класса Huawei.

В дочернем классе Huawei доступ получен ко всем значениям, кроме private.

А из созданного в функции main объекта класса Company  —  лишь к значениям public и internal. Из созданного там же объекта класса Huawei доступ не получен к значению protected.

Определение независимого значения и функции как верхнего уровня принимает все переменные видимости, кроме protected:

Это и логично: у значения или функции никогда не будет дочернего класса.

Заключение

Итак, в Kotlin четыре модификатора видимости. Если модификатор не указан, по умолчанию используется public. В различных сценариях они применяются по-разному. Нужно определить, какую переменную видимости использовать, и записать ее в соответствии с конкретной ситуацией.

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Hüseyin Özkoç: 👨🏼‍💻Kotlin Visibility Modifiers

Предыдущая статья25 основных вопросов для собеседования с Android-разработчиком. Часть 2
Следующая статьяЧто такое шаблон SAGA и какую проблему он решает в микросервисной архитектуре