Пакеты и модификаторы доступа в Kotlin
#
Васильев Андрей Михайлович, 2024
Версии презентации
Пакеты и импорты
#
Файл с исходным кодом может начинаться с объявления пакета
package org.example
fun printMessage() { /*...*/ }
class Message { /*...*/ }
Всё содержимое файла с исходниками (например, классы и функции) располагается в
объявленном пакете. Таким образом, в приведённом выше примере полное имя функции
printMessage() будет org.example.printMessage
, а полное имя класса Message -
org.example.Message
Если файл не содержит явного объявления пакета, то его содержимое находится в
безымянном пакете по умолчанию.
Импорт по умолчанию
#
По умолчанию в каждый файл Kotlin импортируется несколько пакетов:
kotlin.*
kotlin.annotation.*
kotlin.collections.*
kotlin.comparisons.*
kotlin.io.*
kotlin.ranges.*
kotlin.sequences.*
kotlin.text.*
Дополнительные пакеты импортируются в зависимости от платформы:
Импорт
#
Помимо импорта по умолчанию каждый файл может содержать свои собственные
объявления импорта
Вы можете импортировать одно имя:
import org.example.Message // теперь Message можно использовать без указания пакета
Можете импортировать всё доступное содержимое пространства имён (пакет, класс,
объект и т.д.):
import org.example.* // всё в 'org.example' становится доступно без указания пакета
При совпадении имён мы можем разрешить коллизию используя ключевое слово as для
локального переименования совпадающей сущности.
import org.example.Message // Message доступен
import org.test.Message as testMessage // testMessage заменяет имя 'org.test.Message'
Сущности для импорта
#
Ключевое слово import
можно использовать не только с классами, но и с другими
объявлениями:
- функции и свойства верхнего уровня
- функции и свойства, объявленные в объявлениях объектов
- перечислениях
Модификаторы доступа
#
- Классы, объекты, интерфейсы, конструкторы, функции, свойства и их сеттеры
могут иметь модификаторы доступа
- Геттеры всегда имеют тут же видимость, что и свойства, к которым они
относятся.
- В Kotlin предусмотрено четыре модификатора доступа:
private
, protected
,
internal
и public
- Если явно не использовать никакого модификатора, то по умолчанию применяется
public
Пакеты
#
Функции, свойства, классы, объекты и интерфейсы могут быть объявлены на самом
“высоком уровне” прямо внутри пакета.
package foo
fun baz() { /*...*/ }
class Bar { /*...*/ }
- Если модификатор доступа не указан, будет использован
public
. Это значит, что весь код данного объявления будет виден из космоса;
- Если вы пометите объявление словом
private
, оно будет иметь видимость только внутри файла, где было объявлено;
- Если вы используете
internal
, видимость будет распространяться на весь модуль;
protected
запрещено использовать в объявлениях “высокого уровня”.
Примеры
#
// имя файла: example.kt
package foo
private fun foo() { /*...*/ } // имеет видимость внутри example.kt
public var bar: Int = 5 // свойство видно со дна Марианской впадины
private set // сеттер видно только внутри example.kt
internal val baz = 6 // имеет видимость внутри модуля
Модули
#
Модификатор доступа internal означает, что этот член видно в рамках его модуля.
Модуль - это набор скомпилированных вместе Kotlin файлов, например:
- модуль IntelliJ IDEA
- Maven-проект
- исходный набор Gradle (за исключением того, что исходный набор test может получить доступ к внутренним объявлениям main)
- набор скомпилированных вместе файлов с одним способом вызова задачи в Ant