Spec-Zone.ru › Kotlin 1.4

Модификаторы видимости

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

Обратите внимание, что вовне, в Kotlin, внешний класс не видит закрытые члены своих внутренних классов.

Если вы переопределяете protected член и не указываете видимость явно, переопределяющий член также будет иметь protected видимость.

Примеры:

open class Outer {
    private val a = 1
    protected open val b = 2
    internal 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
}

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 
}

Конструкторы

Чтобы указать видимость основного конструктора класса, используйте следующий синтаксис (обратите внимание, что вам необходимо добавить явное ключевое слово constructor):

class C private constructor(a: Int) { ... }

Здесь конструктор закрытый. По умолчанию все конструкторы являются public, что по сути означает, что они видны везде, где виден класс (т.е. конструктор класса internal виден только внутри того же модуля).

Локальные объявления

Локальные переменные, функции и классы не могут иметь модификаторы видимости.

Модули

Модификатор видимости internal означает, что член виден в том же модуле. Более точно, модуль — это набор файлов Kotlin, скомпилированных вместе:

  • модуль IntelliJ IDEA;
  • проект Maven;
  • набор Gradle-проектов (за исключением того, что test набор проектов может получать доступ к внутренним объявлениям main);
  • набор файлов, скомпилированных с помощью одного вызова задачи <kotlinc> Ant.

© 2010–2020 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/reference/visibility-modifiers.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API