Видимость 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
вызовите эту функцию из своего метода.