Как мне получить доступ к экземпляру enum, используя его свойство в Kotlin? - PullRequest
0 голосов
/ 15 марта 2020

У меня есть такой класс перечисления:

enum class ParkingLotStatus (val number:Int, var occupied: Boolean) {
        LOT1(1,true),
        LOT2(2,false)
    }

Я хочу выбрать экземпляр перечисления с помощью переменной number. Если я получу пользовательский ввод как 1, я хочу иметь возможность выбрать интенсивное перечисление LOT1 на основе переменной (константы?) number.

Одним из способов будет итерация по всем Перечислите экземпляры и проверьте, соответствует ли ввод переменной

Есть ли более простой и не ресурсоемкий способ сделать это?

Ответы [ 3 ]

2 голосов
/ 15 марта 2020

Примерно так будет работать:

fun main(args: Array<String>) {
    val parking = ParkingLotStatus.get(1) // LOT1
}
enum class ParkingLotStatus (var occupied: Boolean) {
    LOT1(true),
    LOT2(false);
    companion object {
        fun get(number: Int) = when(number){
            1 -> LOT1
            2 -> LOT2
            else -> throw UnsupportedOperationException("Invalid parking number")
        }
    }
}

Я бы также предложил переключиться на sealed class es over Enum s

1 голос
/ 15 марта 2020

В случае, если вам нужно делать это часто, инициализация карты достаточно проста:

enum class ParkingLotStatus (val number:Int, var occupied: Boolean) {
    LOT1(1,true),
    LOT2(2,false);
    companion object {
        private val map = values().associateBy { it.value }
        fun byValue(number: Int): ParkingLotStatus? = map[number]
    }
}

Проблема в том, что поиск в хэш-карте может на самом деле медленнее, чем итерация небольшого массива. Простым и надежным улучшением будет сохранение массива значений:

enum class ParkingLotStatus (val number:Int, var occupied: Boolean) {
    LOT1(1,true),
    LOT2(2,false);
    companion object {
        private val allValues = values()
        fun byValue(number: Int): ParkingLotStatus? = allValues.find { it.number == number }
    }
}
1 голос
/ 15 марта 2020

Использование enumValues() и итерация по ним - в значительной степени путь к go. Если вы измерите влияние итерации на производительность, вы, вероятно, обнаружите, что это не так дорого, особенно если учесть, что у вас не будет слишком много констант enum.

Вы можете сохранить карту (number, enumValue) пары, но я готов поспорить, что увеличение производительности не стоит дополнительных усилий по обслуживанию обновления этой карты каждый раз, когда что-либо в значениях перечисления изменяется.

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