Назад к вопросам
Junior
125
questionbank

Что такое модификаторы видимости и как их использовать в Kotlin?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

Основные модификаторы видимости:

  • public: Видно везде. Является модификатором по умолчанию.
  • internal: Видно только внутри одного модуля. Модулем считается набор Kotlin-файлов, компилируемых вместе.
  • protected: Видно внутри класса и его подклассов (включая членов, определенных в классах-наследниках). Не видно извне пакета.
  • private: Видно только внутри файла, в котором объявлено. Для членов класса видно только внутри этого класса (и его companion object, вложенных и внутренних классов).

Применение модификаторов:

  • У классов, интерфейсов, объектов и их конструкторов.
  • У функций, свойств и их геттеров/сеттеров на верхнем уровне (за пределами классов).
  • У членов класса (вложенных классов, внутренних классов, функций, свойств).

Пример:

// Файл: example.kt

private const val PRIVATE_CONSTANT = 1 // Видно только в этом файле

internal fun internalFunction() { // Видно только внутри модуля
    println("Internal function called")
}

open class BaseClass {
    protected val protectedProperty = "Protected" // Видно в этом классе и его подклассах

    fun publicMethod() { // Видно везде (public по умолчанию)
        println("Public method called")
    }

    private fun privateMethod() { // Видно только внутри BaseClass
        println("Private method called")
    }
}

class DerivedClass : BaseClass() {
    fun accessProtected() {
        println("Accessing protected property: $protectedProperty") // Доступ к protected
        // privateMethod() // Ошибка: private не видно в подклассе
    }
}

fun main() {
    val base = BaseClass()
    base.publicMethod()
    // base.protectedProperty // Ошибка: protected не видно вне класса и подклассов

    val derived = DerivedClass()
    derived.accessProtected()

    internalFunction()
    // PRIVATE_CONSTANT // Ошибка: private на верхнем уровне видно только в файле объявления
}
Модификатор Доступность Где использовать
public Везде По умолчанию, когда не указан другой модификатор
internal Внутри модуля Для API внутри библиотеки или модуля
protected Внутри класса и его подклассов (для членов класса) Для создания иерархии классов с наследованием
private Внутри файла (для верхнего уровня); внутри класса (для членов) Для сокрытия деталей реализации внутри файла или класса