На этом шаге мы рассмотрим особенности объявления и использования таких переменных.
До настоящего времени мы использовали только переменные, которым можно присвоить новые значения. Но часто возникает необходимость использовать переменные, неизменные на протяжении всего времени выполнения программы. Например, в текстовой приключенческой игре имя игрока не должно меняться после начального присваивания.
Язык Kotlin предлагает возможность объявления переменных, доступных только для чтения, - такие переменные нельзя изменить после присваивания начального значения.
Переменная, которую можно изменить, объявляется с помощью ключевого слова var. Чтобы объявить переменную, доступную только для чтения, используется ключевое слово val.
В разговорной речи переменные, которые могут изменяться, мы называем vars, а переменные, доступные только для чтения, - vals. Мы будем соблюдать это правило с этого момента, так как словосочетания "переменная" и "переменная, доступная только для чтения" занимают слишком много места. vars и vals - это все "переменные", и мы будем использовать эти сокращения, чтобы обозначить их в тексте.
Добавьте объявление val для хранения имени игрока и добавьте его вывод после вывода очков игрока.
fun main() { val playerName: String = "Estragon" var experiencePoints: Int = 5 experiencePoints += 5 println(experiencePoints) println(playerName) }
Рис.1. Результат добавления строк в функцию
Запустите программу, нажав кнопку "Запуск" рядом с функцией main() и выбрав Run 'TypeIntroKt'. Значения experiencePoints и playerName должны появиться в консоли:
Рис.2. Результат работы приложения
Далее попробуйте изменить значение playerName, попытавшись присвоить другое строковое значение, и снова запустите программу.
fun main() { val playerName: String = "Estragon" playerName = "Madrigal" var experiencePoints: Int = 5 experiencePoints += 5 println(experiencePoints) println(playerName) }
Рис.3. Пытаемся изменить неизменяемую переменную
В консоли появится следующее сообщение об ошибке:
Kotlin: Val cannot be reassigned: 3
Рис.4. Результат изменения значения переменной
Компилятор сообщил о попытке изменить val. После начального присваивания значение val нельзя изменить.
Удалите вторую инструкцию присваивания, чтобы исправить эту ошибку.
vals полезны для защиты от случайного изменения значений переменных, которые используются только для чтения. По этой причине мы рекомендуем использовать val всегда, когда не требуется var.
В процессе анализа кода IntelliJ способна определить, когда var можно превратить в val. Если var не изменяется по ходу программы, IntelliJ предложит преобразовать его в val. Мы рекомендуем следовать этим рекомендациям, если, конечно, вы не собираетесь писать код для изменения значений var. Чтобы увидеть, как выглядит предложение от IntelliJ, поменяйте playerName на var.
fun main() { var playerName: String = "Estragon" var experiencePoints: Int = 5 experiencePoints += 5 println(experiencePoints) println(playerName) }
Рис.5. Замена val на var
Так как значение playerName нигде не изменяется, нет необходимости (и так делать не надо) объявлять его как var. Обратите внимание, что IntelliJ выделила ключевое слово var горчичным цветом. Если навести указатель мыши на ключевое слово var, IntelliJ сообщит о предлагаемом изменении (рисунок 6).
Рис.6. Переменная нигде не изменяется
Как и ожидалось, IntelliJ предлагает преобразовать playerName в val. Чтобы подтвердить изменение, щелкните на ключевом слове var рядом с playerName и в появившемся меню выберите Change to val или нажмите комбинацию клавиш Alt + Shift + Enter (рисунок 6). IntelliJ автоматически заменит var на val.
Как уже говорилось, мы рекомендуем использовать val всегда, когда возможно, чтобы Kotlin мог предупредить о случайных непреднамеренных попытках присвоить другое значение. Также рекомендуем обращать внимание на предложения IntelliJ насчет возможного улучшения кода. Их можно и не использовать, но взглянуть стоит.
На следующем шаге мы рассмотрим автоматическое определение типов.