Введение
Модификаторы видимости — это ключевые слова, которыми определяется уровень доступности элементов: классов, объектов, интерфейсов, конструкторов, функций, свойств и их сеттеров.
В 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. В различных сценариях они применяются по-разному. Нужно определить, какую переменную видимости использовать, и записать ее в соответствии с конкретной ситуацией.
Читайте также:
- С Kotlin приведение стало еще удобнее
- Kotlin Coroutines для Android — Прощай RxJava?
- Разностный алгоритм Майерса и наблюдаемые свойства в Kotlin - как их объединить, чтобы облегчить жизнь разработчика
Читайте нас в Telegram, VK и Дзен
Перевод статьи Hüseyin Özkoç: 👨🏼💻Kotlin Visibility Modifiers