Spec-Zone.ru › Kotlin 1.8

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

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

В 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 (за исключением того, что test набор файлов может получить доступ к внутренним объявлениям main).

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

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

© 2010–2023 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