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

Ответ

В Kotlin есть 4 модификатора доступа:

  1. public (по умолчанию) - виден везде
  2. private - виден только внутри класса/файла
  3. protected - виден в классе и наследниках
  4. 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 работают.

Короче, суть в чём: правильно расставляя эти модификаторы, ты не даёшь всяким распиздяям из других частей программы ковыряться в твоих внутренних кишках. Это и есть инкапсуляция, мать её. Сначала кажется, что занудство, но потом, когда проект вырастает до овердохуища строк, ты понимаешь, что это спасло тебе сотни часов дебага. Потому что доверия к коду коллег — ноль ебать, а так ты хотя бы знаешь, что они в твой приватный метод просто так не влезут.