9. Изучите синглтоны и перечисления
В этом задании вы познакомитесь с некоторыми специализированными классами Kotlin, в том числе со следующими:
- Классы Синглтона
- Сопутствующие объекты
- Перечисления
Шаг 1: Вспомним классы-одиночки
Вспомним предыдущий пример с GoldColorклассом.
object GoldColor : FishColor {
override val color = "gold"
}
Поскольку каждый экземпляр GoldColorделает одно и то же, он объявляется как объект типа `index.html` objectвместо ` classindex.html`, чтобы стать синглтоном. Может существовать только один его экземпляр.
Шаг 2: Создайте перечисление (enum).
Kotlin также поддерживает перечисления (enums), которые представляют собой набор именованных значений или констант. Перечисления — это особый тип классов в Kotlin, который позволяет обращаться к значению по имени, как и в других языках. Они могут улучшить читаемость кода. Каждая константа в перечислении enumявляется объектом. Объявление перечисления осуществляется путем добавления перед ним ключевого слова `enum` enum. Базовое объявление перечисления требует только списка имен, но вы также можете определить одно или несколько полей, связанных с каждым именем.
- В файле Decoration.kt попробуйте пример перечисления (enum).
enum class Color(val rgb: Int) {
RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF);
}
Перечисления похожи на синглтоны — в перечислении может быть только одно значение каждого типа, и только одно значение каждого типа. Например, может быть только одно значение типа `<null>` Color.RED, одно значение типа `<null> Color.GREEN` и одно Color.BLUEзначение типа `<null>`. В этом примере значения RGB присваиваются свойству `<null>` rgbдля представления цветовых компонентов. У перечислений есть и другие полезные характеристики. Например, вы можете получить порядковое значение перечисления, используя свойство `<null>` ordinal, и его имя, используя nameсвойство `<null>`.
- Попробуйте другой пример перечисления в REPL.
enum class Direction(val degrees: Int) {
NORTH(0), SOUTH(180), EAST(90), WEST(270)
}
fun main() {
println(Direction.EAST.name)
println(Direction.EAST.ordinal)
println(Direction.EAST.degrees)
}
⇒ EAST 2 90