Какой модификатор доступа по умолчанию в Kotlin
Что проверяют
Базу языка и то, чем Kotlin отличается от Java. Ответ «public» занимает секунду, поэтому следом спрашивают, что такое internal и чем protected в Kotlin отличается от джавового.
Как отвечать
По умолчанию в Kotlin всё public: классы, функции и свойства без модификатора видны отовсюду. В Java по умолчанию package-private, а в Kotlin такого уровня нет вообще.
Дальше коротко пройдите по всем четырём:
public: виден везде, модификатор по умолчанию;internal: виден внутри одного модуля, в Android-проекте это Gradle-модуль. Главный инструмент многомодульной архитектуры: реализация остаётся внутри:feature:profile, наружу торчит только интерфейс;protected: только внутри класса и его наследников. В отличие от Java, классы того же пакета доступа не получают. На верхнем уровне файла не применяется;private: внутри класса виден только в нём, а для объявления верхнего уровня означает «видно в пределах файла».
Детали, которые выделят ответ:
- override: переопределённый член без модификатора сохраняет видимость родителя;
- сеттер: свойство
stateвоViewModelобъявляют сprivate set, снаружи его можно только читать; - байткод:
internalстановитсяpublicс изменённым именем, поэтому из Java технически доступен; explicitApi(): режим для библиотек в блокеkotlinGradle-скрипта, требует указывать видимость явно.
Помните и про соседнюю тему: классы и методы по умолчанию final, наследоваться можно только от open. Это не модификатор доступа, но разговор часто продолжается именно так.
Где спотыкаются
Отвечают «package-private, как в Java». Самая частая ошибка, и она показывает, что Java-привычки перенесены без проверки.
Считают, что internal ограничивает пакет. Он ограничивает модуль компиляции, и в одномодульном приложении фактически равен public.
Ждут от protected доступа из соседнего класса того же пакета, как в Java. В Kotlin такого нет, код просто не скомпилируется.