Const против Val: понимание разницы в Котлине

В Kotlin при объявлении переменных есть два варианта: constи val. Хотя на первый взгляд они могут показаться похожими, между ними есть фундаментальные различия. В этой статье мы рассмотрим различия между constи valи попутно приведем примеры кода.

Const – неизменяемая константа:
Начнем с const. В Kotlin constиспользуется для объявления констант времени компиляции. Эти константы известны во время компиляции и не могут быть изменены во время выполнения. Они привязываются к определенному значению во время компиляции и сохраняются в байт-коде. Вот пример:

const val PI = 3.14159

В приведенном выше фрагменте кода мы объявляем константу PIсо значением 3.14159. Поскольку это константа времени компиляции, мы можем использовать ее в аннотациях, а также в выражениях, требующих постоянных значений.

Val — неизменяемая переменная:
С другой стороны, valиспользуется для объявления переменных, доступных только для чтения, в Kotlin. После присвоения значение valне может быть изменено. Это похоже на объявление переменной finalв Java. Вот пример:

val name = "John Doe"

В приведенном выше фрагменте кода name— это переменная, доступная только для чтения, с начальным значением «Джон Доу». Мы можем получить доступ к nameво всей программе, но не можем переназначить ему новое значение.

Различия в использовании.
Основное различие между constи valзаключается в их использовании и времени, в которое им присваивается значение. Вот несколько ключевых моментов, которые следует запомнить:

Значения

  1. Constдолжны быть объявлены на верхнем уровне или внутри объявления объекта или сопутствующего объекта. Они не могут быть локальными переменными или членами класса.
  2. С другой стороны,

  3. Valпеременные могут быть объявлены где угодно, в том числе внутри функции, как член класса или как локальная переменная.
  4. Значения

  5. Constоцениваются во время компиляции, а переменные valоцениваются во время выполнения.
  6. Значения

  7. Constмогут содержать только примитивные типы или строки, тогда как переменные valмогут содержать объекты любого типа.

Пример кода:

// Const example
const val MAX_SIZE = 100
// Val example
fun printName() {
    val name = "Alice"
    println("Name: $name")
}
class Person {
    val age = 25
    companion object {
        const val GREETING = "Hello"
    }
}
fun main() {
    printName()
    val person = Person()
    println("${Person.GREETING}, I am ${person.age} years old.")
}

В приведенном выше примере кода мы демонстрируем использование как const, так и val. Мы объявляем значение constMAX_SIZE, переменную valnameвнутри функции и valпеременная ageкак член класса Person.

Подводя итог: constиспользуется для констант времени компиляции, а val— для переменных, доступных только для чтения. Значения Constоцениваются во время компиляции и имеют некоторые ограничения на то, где их можно объявлять, тогда как переменные valоцениваются во время выполнения и могут быть объявлены где угодно. Понимание разницы между constи valнеобходимо для написания надежного и эффективного кода Kotlin.