Альтернатива ответу @ s1m0nw1, который делает поиск только один раз:
interface EnumCodesMap<E : Enum> {
fun values(): Array<E>
val codesMap = values().associate { it.code to it }
}
enum class OpCode(val code: Byte) {
Foo(1),
Bar(2),
Yak(3);
companion object : EnumCodesMap<OpCode>
}
...
val opCode = OpCode.codesMap[stream.read().toByte()]
Обратите внимание, что что-то подобное не может быть встроенным, потому что вы можете иметь несколько значений с одним и тем же code
:
enum class OpCode(val code: Byte) {
Foo(1),
Bar(1)
}
Редактировать: вы можете извлечь его для поддержки нескольких перечислений, но с некоторыми хитростями:
inline fun <reified E : Enum<E>, K> EnumCodesMap(crossinline getKey: (E) -> K) = object : EnumCodesMap<E, K> {
override val codesMap = enumValues<E>().associate { getKey(it) to it }
}
interface EnumCodesMap<E : Enum<E>, K> {
val codesMap: Map<K, E>
}
enum class OpCode(val code: Byte) {
Foo(1),
Bar(2),
Yak(3);
companion object : EnumCodesMap<OpCode, Byte> by EnumCodesMap({ it.code })
}