Пакеты и модификаторы доступа в 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.*
Дополнительные пакеты импортируются в зависимости от платформы:
- JVM:
java.lang.*
kotlin.jvm.*
- JS:
kotlin.js.*
Импорт #
Помимо импорта по умолчанию каждый файл может содержать свои собственные объявления импорта
Вы можете импортировать одно имя:
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