Enum#valueOf
основано на имени .Что означает, чтобы использовать это, вам нужно будет использовать valueof("FOO")
.Метод valueof
также принимает строку, которая объясняет ошибку.Строка не Int;типы имеют значение.Причина, по которой я упомянул, что она делает, в том, что вы знаете, что это не тот метод, который вы ищете
Если вы хотите получить его на основе значения типа int, вам нужно определить собственную функцию для этого.Вы можете получить значения в перечислении, используя values()
, что в этом случае возвращает Array<Types>
.Вы можете использовать firstOrNull
в качестве безопасного подхода или first
, если вы предпочитаете исключение, а не ноль.
Поэтому добавьте объект-компаньон (который является статическим относительно перечисления, чтобы вы могли вызывать Types.getByValue(1234)
(Types.COMPANION.getByValue(1234)
из Java) через Types.FOO.getByValue(1234)
.
companion object {
private val values = values();
fun getByValue(value: Int) = values.firstOrNull { it.value == value }
}
values()
возвращает новый массив каждый раз, когда он вызывается, что означает, что вы должны кэшировать его локально, чтобы не создавать заново каждый раз, когда вы вызываете getByValue
. Если вы вызываете values()
при вызове метода, вы рискуете воссоздать егонесколько раз (в зависимости от того, сколько раз вы на самом деле вызываете его), что является пустой тратой памяти.
Функция также может быть расширена и проверять на основе нескольких параметров, если это то, что вы хотите сделать. Эти типыфункций не ограничены одним аргументом.
Именование функции полностью зависит от вас. Это не обязательно должно быть getByValue
.