Kotlin: зачем компилятору нужен модификатор `const`?

В Котлине есть:

  • свойство val – readonly
  • const val – константы времени компиляции

Из документации :

Константы времени компиляции

Свойства, значение которых известно во время компиляции, могут быть помечены как константы времени компиляции с использованием модификатора const . Такие свойства должны соответствовать следующим требованиям:

  • Верхний уровень или элемент объекта
  • Инициализируется значением типа String или примитивным типом
  • Нет пользовательских геттеров

Учитывая, что компилятор kotlin знает, чтобы идентифицировать инициализированные значения (например, нет необходимости в определении типа переменной в инициализаторе):

  • Почему компилятор нуждается в помощи программиста?
  • Не может ли он определить «свойства, значение которых известно во время компиляции» и «добавить» модификатор const самостоятельно?

Модификатор константы серьезно меняет договор собственности.

Например, если у вас есть регулярное свойство, вы можете добавить к нему специальный getter, не затрагивая код, который его использует.

С другой стороны, вам нужно будет перекомпилировать код пользователя, чтобы удалить const и добавить геттеры. Другими словами, вы теряете преимущество наличия свойства над полем.

Такие ключевые слова полезны двумя способами:

  • Они позволяют компилятору сделать более сильные предположения. Это позволяет A) всевозможные методы оптимизации B) более строгая проверка. Если вы объявляете что-то const , компилятор может ударить пальцем, когда вы попытаетесь его изменить.
  • Они выражают намерение . Имейте в виду, что вы не пишете код, чтобы сделать компилятор счастливым – но общаться с другими людьми, читающими этот код позже.

Значение: если вы не указали const в своем исходном коде сегодня – но у вас также нет утверждений, изменяющих это поле … означает ли это, что вы намерены, чтобы значение было константой? Не возражаете, если кто-то еще добавит код, который переустанавливает это поле в каком-то месте? Используя const вы ясно даете понять, что вы этого не хотите.