#4 Уроки Kotlin. Введение: модификаторы доступа

Уроки Kotlin 4

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

Это модификаторы доступа в Kotlin:

private, protected, internal и public.По умолчанию используется модификатор public.

Пакеты

Функции, свойства и  классы, объекты и интерфейсы могут объявлены  как “top-level”, т. е. находиться внутри пакета:

// имя файла: example.kt
package foo

fun baz() {}
class Bar {}

— Если вы не укажете модификатор, по умолчанию будет использован модификатор public и все объявления будут доступны во всем пакете

— Если вы укажете в качестве модификатора private, объявления будут видны только внутри файла содержащего декларацию

— Если вы укажете в качестве модификатора internal, объявления будут видны во всем модуле

— protected не доступен для «top-level»-объявлений

Примеры:

// имя файла: 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 — все клиенты внутри этого модуля могут видеть класс;
  • public —все клиенты могут видеть класс.

Примечание для пользователей Java: внешний класс не видит private-поля своих внутренних классов в Kotlin.

Примеры:

open class Outer {
    private val a = 1
    protected val b = 2
    internal val c = 3
    val d = 4  // public по умолчанию
    
    protected class Nested {
        public val e: Int = 5
    }
}

class Subclass : Outer() {
    // a не виден
    // b, c и d видны
    // Nested и e видны
}

class Unrelated(o: Outer) {
    // o.a, o.b не видны
    // o.c и o.d видны
    // Outer.Nested не виден, и Nested::e не виден
}

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

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

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

Здесь конструктор является приватным.

Локальные переменные

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

Модули

Модификатор internal означает видимость внутри модуля:

  • модуль IntelliJ IDEA (или Android Studio);
  • проект Maven или Gradle;
  • набор файлов скомпилированных одним вызовом Ant задачи.

Источник: Visibility Modifiers

Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *