Модификаторы доступа
Классы, объекты, интерфейсы, конструкторы, функции, свойства и их сеттеры могут иметь модификаторы доступа. Геттеры всегда имеют тут же видимость, что и свойства, к которым они относятся.
В Kotlin предусмотрено четыре модификатора доступа: private, protected, internal и public.
Если явно не использовать никакого модификатора, то по умолчанию применяется public.
На этой странице вы узнаете, как использовать модификаторы для всех областей видимости.
Пакеты
Функции, свойства, классы, объекты и интерфейсы могут быть объявлены на самом “высоком уровне” прямо внутри пакета.
// имя файла: example.kt
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 // имеет видимость внутри модуля
Члены класса
Для членов, объявленных в классе:
privateозначает видимость только внутри этого класса (включая его члены);protected— то же самое, что иprivate+ видимость в субклассах;internal— любой клиент внутри модуля, который видит объявленный класс, видит и егоinternalчлены;public— любой клиент, который видит объявленный класс, видит егоpublicчлены.
В Kotlin внешний класс не видит
privateчлены своих вложенных классов.
Если вы переопределите protected или internal член и явно не укажете его видимость,
переопределённый элемент будет иметь тот же модификатор, что и исходный.
Примеры:
open class Outer {
private val a = 1
protected open val b = 2
internal open val c = 3
val d = 4 // public по умолчанию
protected class Nested {
public val e: Int = 5
}
}
class Subclass : Outer() {
// a не видно
// b, c и d видно
// класс Nested и e видно
override val b = 5 // b - protected
override val c = 7 // c - internal
}
class Unrelated(o: Outer) {
// o.a и o.b не видно
// o.c и o.d видно (тот же модуль)
// Outer.Nested не видно, и Nested::e также не видно
}
Конструкторы
Для указания видимости основного конструктора класса используется следующий синтаксис:
Вам необходимо добавить ключевое слово
constructor.
class C private constructor(a: Int) { ... }
В этом примере конструктор помечен private. По умолчанию все конструкторы имеют модификатор доступа public,
то есть видны везде, где виден сам класс (а вот конструктор internal класса видно только в том же модуле).
Локальные объявления
Локальные переменные, функции и классы не могут иметь модификаторов доступа.
Модули
Модификатор доступа internal означает, что этот член видно в рамках его модуля.
Модуль - это набор скомпилированных вместе Kotlin файлов, например:
- модуль IntelliJ IDEA;
- Maven проект;
- исходный набор Gradle (за исключением того, что исходный набор
testможет получить доступ к внутренним объявлениямmain); - набор скомпилированных вместе файлов с одним способом вызова
<kotlinc>задачи в Ant.