← Назад к вопросам

Какие знаешь модификаторы доступа для элементов класса?

1.0 Junior🔥 251 комментариев
#JVM и память#Kotlin основы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Модификаторы доступа в Kotlin для элементов класса

В Kotlin существует четыре основных модификатора доступа, которые регулируют видимость элементов класса (свойств, методов, вложенных классов). Каждый из них имеет свой уровень доступности и область применения.

public

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

class User {
    public fun getName(): String = "John"  // доступна везде
}

// Использование
val user = User()
user.getName()  // работает

private

private — самый строгий уровень доступа. Элементы приватны и доступны только внутри того файла, где они определены. Для файлов приватность означает видимость только внутри этого файла, для членов класса — только внутри класса.

class BankAccount {
    private var balance: Double = 1000.0  // недоступна извне
    private fun validateTransaction() {}   // внутренний метод
    
    fun withdraw(amount: Double) {
        validateTransaction()  // доступна внутри класса
        if (amount <= balance) {
            balance -= amount
        }
    }
}

val account = BankAccount()
// account.balance  // ошибка компиляции
// account.validateTransaction()  // ошибка компиляции

protected

protected — модификатор для наследования. Элементы protected доступны внутри класса и его подклассов, но не доступны снаружи. Это полезно для создания внутренних API для наследников.

open class Animal {
    protected fun makeSound() {
        println("Some sound")
    }
}

class Dog : Animal() {
    fun bark() {
        makeSound()  // доступна в подклассе
    }
}

val dog = Dog()
dog.bark()  // работает
// dog.makeSound()  // ошибка компиляции

internal

internal — модификатор видимости на уровне модуля. Элементы доступны во всём модуле (все классы и файлы в одном модуле), но не доступны в других модулях. Это полезно при разработке SDK или библиотек.

internal class InternalHelper {
    internal fun helperMethod() {}
}

// Доступна в том же модуле
val helper = InternalHelper()  // работает

// В другом модуле — ошибка компиляции

Таблица сравнения

МодификаторКлассПакетМодульМир
public
protected✓ (наследники)
internal
private

Best Practices

  • Начинай с private по умолчанию, открывай только необходимое
  • protected используй для наследования, не для повседневной работы
  • internal применяй для библиотек, где нужна внутренняя API
  • public только для публичного контракта класса

Этот подход следует принципу минимальной привилегии и делает код безопаснее и проще для поддержки.