Модификаторы видимости
Классы, объекты, интерфейсы, конструкторы и функции, а также свойства и их сеттеры, могут иметь модификаторы видимости. Геттеры всегда имеют ту же видимость, что и их свойства.
В Kotlin есть четыре модификатора видимости: private, protected, internal, и public. По умолчанию используется видимость public.
На этой странице вы узнаете, как модификаторы применяются к различным типам областей объявления.
Пакеты
Функции, свойства, классы, объекты и интерфейсы могут быть объявлены на верхнем уровне непосредственно внутри пакета:
// file name: example.kt
package foo
fun baz() { ... }
class Bar { ... }
Если вы не используете модификатор видимости, по умолчанию используется
public, что означает, что ваши объявления будут видны повсюду.Если вы помечаете объявление как
private, оно будет видно только внутри файла, содержащего объявление.Если вы помечаете его как
internal, оно будет видно повсюду в том же модуле.Модификатор
protectedнедоступен для объявлений на верхнем уровне.
Примеры:
// file name: example.kt
package foo
private fun foo() { ... } // visible inside example.kt
public var bar: Int = 5 // property is visible everywhere
private set // setter is visible only in example.kt
internal val baz = 6 // visible inside the same module
Члены класса
Для членов, объявленных внутри класса:
privateозначает, что член виден только внутри этого класса (включая все его члены).protectedозначает, что член имеет такую же видимость, как и член, помеченный какprivate, но также виден в подклассах.internalозначает, что любой клиент внутри этого модуля, который видит класс объявления, видит егоinternalчлены.publicозначает, что любой клиент, который видит класс объявления, видит егоpublicчлены.
Если вы переопределяете член protected или internal и не указываете видимость явно, переопределяющий член также будет иметь такую же видимость, как и исходный.
Примеры:
open class Outer {
private val a = 1
protected open val b = 2
internal open val c = 3
val d = 4 // public by default
protected class Nested {
public val e: Int = 5
}
}
class Subclass : Outer() {
// a is not visible
// b, c and d are visible
// Nested and e are visible
override val b = 5 // 'b' is protected
override val c = 7 // 'c' is internal
}
class Unrelated(o: Outer) {
// o.a, o.b are not visible
// o.c and o.d are visible (same module)
// Outer.Nested is not visible, and Nested::e is not visible either
}
Конструкторы
Используйте следующий синтаксис для указания видимости первичного конструктора класса:
class C private constructor(a: Int) { ... }
Здесь конструктор приватный. По умолчанию все конструкторы public, что фактически эквивалентно тому, что они видны повсюду, где виден класс (это означает, что конструктор класса internal виден только в рамках одного модуля).
Локальные объявления
Локальные переменные, функции и классы не могут иметь модификаторов видимости.
Модули
Модификатор видимости internal означает, что член виден внутри одного модуля. Более конкретно, модуль — это набор файлов Kotlin, скомпилированных вместе, например:
Модуль в IntelliJ IDEA.
Проект Maven.
Набор файлов Gradle source set (за исключением того, что
testsource set может получить доступ к внутренним объявлениямmain).Набор файлов, скомпилированных с помощью одного вызова задачи
<kotlinc>Ant.
© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/visibility-modifiers.html