Какие знаешь модификаторы доступа для элементов класса?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Модификаторы доступа в 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 только для публичного контракта класса
Этот подход следует принципу минимальной привилегии и делает код безопаснее и проще для поддержки.