Ответ
В Kotlin есть 4 модификатора доступа:
public(по умолчанию) - виден вездеprivate- виден только внутри класса/файлаprotected- виден в классе и наследникахinternal- виден в пределах модуля
Пример:
open class Example {
public val a = 1 // видно везде
private val b = 2 // только внутри Example
protected val c = 3 // в Example и наследниках
internal val d = 4 // в пределах модуля
}
Для top-level объявлений (вне класса) доступны только public, private и internal.
Ответ 18+ 🔞
А, ну это про модификаторы доступа! Ёпта, тема простая, но если не врубиться сразу — потом пиздец как сложно. Слушай, сейчас разжуем.
Представь, что у тебя есть квартира — это твой класс. И вот у тебя там есть вещи: телевизор, холодильник, ну и, допустим, заначка от жены в носке. Так вот, модификаторы доступа — это как ты раздаёшь ключи от разных комнат.
public — это как парадная дверь нараспашку. Кто угодно, откуда угодно может зайти и взять. В Kotlin это дефолтный вариант, если ты не указал ничего. То есть, если ты ленивая жопа и не написал модификатор — всё считается публичным. Опасно, конечно, но так уж устроено.
public val a = 1 // Видно всем, как мой долг по ипотеке
private — это твой сейф или тот самый носок с заначкой. Только внутри этого конкретного класса (или файла, если объявление на верхнем уровне) к этому можно обращаться. Снаружи — хуй тебе, а не доступ. Никакой наследник, даже самый любимый, сюда не залезет.
private val b = 2 // Моя тайная заначка на пиво. Только я в этом классе о ней знаю.
protected — а вот это уже интересно. Это как ключ от кладовки, который ты оставил только детям (наследникам). Сам класс и все его наследники могут этим пользоваться. А вот какой-нибудь левый сосед (другой класс в том же модуле) — уже нет.
open class Example {
protected val c = 3 // Видно мне и моим детям-наследникам. Посторонним — низя!
}
internal — вот тут, бля, у людей часто волнение ебать начинается. А штука-то простая! Это видимость в пределах модуля. Модуль — это, грубо говоря, твой проект или библиотека. Представь, что ты живёшь в закрытом посёлке (модуле). Все соседи (другие классы внутри проекта) могут ходить к тебе в гости и брать эту вещь. А вот люди с улицы (другой проект или библиотека) — нихуя не увидят. Очень удобно, чтобы не светить внутреннюю кухню наружу.
internal val d = 4 // Видно всем в нашем закрытом посёлке-проекте. Внешним — трындец.
И ещё важный момент, ёб твою мать! Для объявлений вне классов (так называемые top-level объявления) protected использовать нельзя. Ну логично же: нет родительского класса — некому наследовать и защищать. Там только public, private (будет видно только в этом файле) и internal работают.
Короче, суть в чём: правильно расставляя эти модификаторы, ты не даёшь всяким распиздяям из других частей программы ковыряться в твоих внутренних кишках. Это и есть инкапсуляция, мать её. Сначала кажется, что занудство, но потом, когда проект вырастает до овердохуища строк, ты понимаешь, что это спасло тебе сотни часов дебага. Потому что доверия к коду коллег — ноль ебать, а так ты хотя бы знаешь, что они в твой приватный метод просто так не влезут.