Модификаторы доступа
Классы, объекты, интерфейсы, конструкторы, функции, свойства и их сеттеры могут иметь модификаторы доступа. Геттеры всегда имеют тут же видимость, что и свойства, к которым они относятся.
В 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.