Методы enum в Kotlin
В теле enum class можно объявлять функции, общие
для всех констант. Они вызываются у конкретной константы
через точку:
enum class Direction {
NORTH, EAST, SOUTH, WEST;
fun opposite(): Direction = when (this) {
NORTH -> SOUTH
SOUTH -> NORTH
EAST -> WEST
WEST -> EAST
}
}
fun main() {
println(Direction.NORTH.opposite())
}
Если поведение у констант разное, у отдельной константы можно задать собственное тело в фигурных скобках и переопределить абстрактный метод enum - по той же схеме, что абстрактный метод у наследника абстрактного класса:
enum class Operation {
ADD {
override fun apply(a: Int, b: Int) = a + b
},
SUB {
override fun apply(a: Int, b: Int) = a - b
},
MUL {
override fun apply(a: Int, b: Int) = a * b
};
abstract fun apply(a: Int, b: Int): Int
}
fun main() {
println(Operation.MUL.apply(6, 7))
}
Точка с запятой после последней константы отделяет список значений от объявлений методов и полей в теле enum. Без нее компилятор воспримет следующую строку как еще одну константу:
enum class Priority(val level: Int) {
LOW(1), HIGH(3);
fun isUrgent(): Boolean = level >= 3
}
fun main() {
println(Priority.HIGH.isUrgent())
}
Объявите enum class FileKind с константами
TEXT, IMAGE, ARCHIVE.
Добавьте метод label(): String:
для TEXT верните "text file",
для IMAGE - "image file",
для ARCHIVE - "archive".
Выведите результат для FileKind.IMAGE.
Объявите enum class Sign с константами
PLUS и MINUS и абстрактным методом
apply(value: Int): Int.
Для PLUS прибавьте 1,
для MINUS вычтите 1.
Выведите результат Sign.PLUS.apply(10).