Kotlin: модификаторы видимости
https://t.me/android_itsВведение
Модификаторы видимости — это ключевые слова, которыми определяется уровень доступности элементов: классов, объектов, интерфейсов, конструкторов, функций, свойств и их сеттеров.
В 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. В различных сценариях они применяются по-разному. Нужно определить, какую переменную видимости использовать, и записать ее в соответствии с конкретной ситуацией.