Пакеты и модификаторы доступа в 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