В документации для констант времени компиляции перечислены три требования, которые должно выполнить свойство, чтобы объявить его как const val
. Это:
- Верхний уровень или элемент объекта
- Инициализируется значением типа String или примитивным типом
- Нет пользовательских getter
Требование "Нестандартное получение" заставляет меня думать, что я не могу использовать какие-либо функции в объявлении константы, но это, похоже, не так. Эти компиляции:
const val bitmask = (5 shl 3) + 2
const val aComputedString = "Hello ${0x57.toChar()}orld${((1 shl 5) or 1).toChar()}"
const val comparedInt = 5.compareTo(6)
const val comparedString = "Hello".compareTo("World!")
const val toStringedInt = 5.compareTo(6).toString()
const val charFromString = "Hello World!".get(3)
Однако они не будут компилироваться:
// An extension function on Int.
const val coercedInt = 3.coerceIn(1..5)
// Using operator syntax to call the get-function.
const val charFromString = "Hello World!"[3]
// An immediate type is not a primitive.
const val stringFromImmediateList = "Hello World!".toList().toString()
// Using a function defined by yourself.
fun foo() = "Hello world!"
const val stringFromFunction = foo()
Каковы точные правила для констант времени компиляции?
Есть ли список функций, которые я могу использовать в объявлении константы времени компиляции?