4. Организуйте и определите константы
В этом задании вы познакомитесь с константами в Kotlin и различными способами их организации.
Шаг 1: Изучите разницу между const и val.
- В REPL попробуйте создать числовую константу. В Kotlin можно создавать константы верхнего уровня и присваивать им значение во время компиляции, используя `.`
const val.
const val rocks = 3
Значение присваивается и не может быть изменено, что очень похоже на объявление обычного объекта val. Так в чем же разница между const valи val? Значение const valопределяется во время компиляции, тогда как значение valопределяется во время выполнения программы, а это значит, valчто может быть присвоено функцией во время выполнения.
Это означает, что valзначение можно присвоить из функции, но const valнельзя.
val value1 = complexFunctionCall() // OK
const val CONSTANT1 = complexFunctionCall() // NOT ok
Кроме того, const valэто работает только на верхнем уровне и в классах-синглтонах, объявленных с помощью `<key>` object, а не в обычных классах. Вы можете использовать это для создания файла или объекта-синглтона, содержащего только константы, и импортировать их по мере необходимости.
object Constants {
const val CONSTANT2 = "object constant"
}
val foo = Constants.CONSTANT2
Шаг 2: Создайте вспомогательный объект.
В Kotlin отсутствует понятие констант на уровне класса.
Для определения констант внутри класса необходимо обернуть их в сопутствующие объекты, объявленные с помощью companionключевого слова `contact`. Сопутствующий объект, по сути, является синглтоном внутри класса.
- Создайте класс с дополнительным объектом, содержащим строковую константу.
class MyClass {
companion object {
const val CONSTANT3 = "constant in companion"
}
}
Основное различие между объектами-компаньонами и обычными объектами заключается в следующем:
- Сопутствующие объекты инициализируются из статического конструктора содержащего класса, то есть они создаются при создании объекта.
- Обычные объекты инициализируются лениво при первом обращении к ним, то есть при первом использовании.
Есть и другие нюансы, но на данный момент вам достаточно знать только то, как обернуть константы в классах в сопутствующий объект.