Ответ
Модификаторы доступа определяют область видимости классов, функций и свойств. Kotlin вносит ключевые изменения по сравнению с Java.
Сравнительная таблица:
| Модификатор | Java | Kotlin |
|---|---|---|
| public | Виден везде. | Виден везде. Модификатор по умолчанию. |
| protected | Виден в пакете и подклассах (даже из других пакетов). | Виден только в подклассах. Не даёт доступа внутри пакета. |
| internal | Отсутствует. | Новый модификатор. Виден внутри модуля (набора скомпилированных файлов). |
| private | Виден только внутри класса. | Виден внутри класса или файла (для top-level объявлений). |
| package-private (default) | Виден внутри пакета (модификатор не указывается). | Отсутствует. Вместо него используйте internal для видимости в модуле или private для файла. |
Пример в Kotlin:
// Файл: Network.kt
internal class HttpClient { // Виден в этом модуле
private val apiKey = "secret" // Виден только в этом классе
protected fun init() { } // Виден в HttpClient и его наследниках
fun makeRequest() { } // public по умолчанию, виден везде
}
private fun helper() { } // Видна только в этом файле (Network.kt)
Почему так сделано в Kotlin?
publicпо умолчанию упрощает код.internalрешает проблему слабой инкапсуляции на уровне пакетов в Java, предоставляя контроль на уровне модуля.protectedстановится строже и логичнее, так как пакеты в Kotlin — это в первую очередь способ организации пространств имён, а не механизм контроля доступа.