Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktOpPkVs 100 of 123 menu
◀ ▶

Видимость public и internal на уровне пакета в Kotlin

Модификаторы private и protected в основном относятся к членам класса. На уровне файла и пакета для API чаще используют public и internal. Они задают, может ли другой файл обратиться к классу, функции или свойству верхнего уровня.

По умолчанию объявление верхнего уровня - public: его видят все файлы, которые импортируют пакет или обращаются по полному имени. Явно слово public можно не писать:

package api class User(val name: String) public fun greet(user: User): String { return "hi, ${user.name}" }
package app import api.User import api.greet fun main() { val u = User("Ann") println(greet(u)) }

Ключевое слово internal ограничивает видимость модулем сборки - одним Gradle-модулем или одним артефактом в IntelliJ. Такие типы доступны любому файлу внутри того же модуля, но не снаружи, даже если имя пакета совпадает в другом модуле.

package api internal class Token(val value: String) internal fun newToken(): Token { return Token("secret") }
package app import api.Token import api.newToken class Session { fun open(): Token = newToken() }

Файл Session.kt в том же модуле спокойно использует internal API пакета api. Отдельный модуль библиотеки, подключённый к проекту, эти имена не увидит - для него нужны public типы или явно экспортируемые точки входа.

Ключевое слово internal не прячет класс внутри одного package: другой пакет того же модуля тоже может импортировать internal объявление, если оно лежит в доступном для компиляции исходнике.

В пакете store объявите public класс Product и internal класс Stock. В пакете ui создайте Product и Stock. Убедитесь, что оба типа доступны в одном модуле.

Объявите в пакете util функцию parseId с модификатором internal. В пакете service в классе Loader вызовите эту функцию из своего метода.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить