Spec-Zone.ru › Kotlin 1.7

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

Классы, объекты, интерфейсы, конструкторы и функции, а также свойства и их сеттеры, могут иметь модификаторы видимости. Геттеры всегда имеют ту же видимость, что и их свойства.

В 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 или 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 
}

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

Используйте следующий синтаксис для указания видимости первичного конструктора класса:

Вам нужно добавить явный ключевой constructor.

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

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

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

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

Модули

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

  • Модуль в IntelliJ IDEA.

  • Проект Maven.

  • Набор файлов Gradle source set (за исключением того, что test source set может получить доступ к внутренним объявлениям main).

  • Набор файлов, скомпилированных с помощью одного вызова задачи <kotlinc> Ant.

Последнее изменение: 06 сентября 2022
Функциональные (SAM) интерфейсы Расширения

© 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

Spec-Zone.ru

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