Приведи пример неизменного кода

Ответ

object Constants {
    const val PI = 3.14159
    const val APP_NAME = "MyApp"
}

// или

class MathUtils {
    companion object {
        fun add(a: Int, b: Int): Int = a + b
    }
}

Неизменный (immutable) код - это код, который нельзя изменить после создания. В Kotlin это достигается через:

  • const val для констант времени компиляции
  • object для синглтонов
  • val вместо var
  • data class с val свойствами
  • функции без побочных эффектов (pure functions)

Ответ 18+ 🔞

Да ты посмотри на эту дичь, ебать мои старые костыли! Сидит какой-нибудь джуниор, думает: "Вот сейчас я константу объявлю, и будет мне счастье". А потом через полгода его же код его же и ебёт, потому что он везде var натыкал, и теперь непонятно, где что меняется.

Смотри, вот тебе пример, как надо делать по-взрослому, чтобы потом не охуевать от багов.

object Constants {
    const val PI = 3.14159
    const val APP_NAME = "MyApp"
}

// или

class MathUtils {
    companion object {
        fun add(a: Int, b: Int): Int = a + b
    }
}

Видишь? object — это тебе не просто так. Это синглтон, ёпта. Один на всю программу. Создался один раз и всё, накрылся медным тазом. Никаких лишних инстансов, память не жрёт, как не в себя. А const val — это вообще песня. Константа времени компиляции. Компилятор её прямо в байткод вшивает, и всё, приехали. Никаких сеттеров, никаких изменений, чистая математика.

А теперь слушай сюда, что такое неизменяемый, или, по-умному, immutable код. Это когда ты создал объект — и всё, пиздец. Как скала. Нельзя его изменить, только если новый создать. И это, блядь, офигенная практика, потому что доверия к такому коду — ебать ноль, в хорошем смысле. Ты точно знаешь, что с момента создания он не изменится, и никакая хитрая жопа в другом потоке тебе его не испортит.

Вот как этого добиться в Kotlin, чтобы не быть распиздяем:

  • const val для констант. Как в примере выше. Для примитивов и строк, которые известны заранее.
  • object для синглтонов. Нужен один экземпляр на всё приложение? Вот тебе object, и не хуй городить.
  • val вместо var. Это вообще основа основ, ядрёна вошь! val — значение, var — переменная. Хочешь, чтобы не менялось? Используй val. И мозги включай, когда объявляешь.
  • data class с val свойствами. Объявил дата-класс, все поля сделал через val — и получил идеальную неизменяемую модель для данных. copy() метод тебе в помощь, если нужно "изменить" (создать копию с новым значением).
  • Функции без побочных эффектов (pure functions). Это когда функция, как та самая add(a, b), зависит только от своих аргументов и не лезет ни в какие глобальные состояния. Дал на вход 2 и 3 — всегда получишь 5. Никаких сюрпризов. Красота, а не жизнь.

Вот когда начнёшь так писать, сам от себя охуеешь, насколько проще станет искать баги и понимать, что вообще происходит в твоей программе. А то ведь некоторые такую муть гордят, что потом разгребать — волнение ебать, а терпения ноль.