nkiesel
03/31/2020, 1:02 AMenum class Type(val value: Int) {
INVALID(-1), SIMPLE(1), COMPLEX(2);
companion object {
private val map = values().associateBy(Type::value)
fun fromInt(value: Int) = map.getOrDefault(value, INVALID)
fun fromString(value: String) = try { valueOf(value) } catch (e: IllegalArgumentException) { INVALID }
}
}
Is there a way to avoid repeating the "companion" part in every enum? Ideally, I would want enum class Type(code: Int) : Magic(code) { INVALID(-1), SIMPLE(1), COMPLEX(2); }
with also some way to identify the INVALID obejct (or just assume it is always the value associated to -1
)Dominaezzz
03/31/2020, 1:30 AMnkiesel
03/31/2020, 1:55 AMvalue
in the enum elements and the values()
etc. methods.Dominaezzz
03/31/2020, 12:44 PMnkiesel
04/01/2020, 1:14 AMinterface EnumValue<T> {
val value: T
}
open class EnumCompanion<T, U>(values: Array<T>, val invalid: T) where T: EnumValue<U> {
private val map = values.associateBy { it.value }
fun fromValue(value: U) = map.getOrDefault(value, invalid)
fun fromName(value: String) = map.values.find { it.toString() == value } ?: invalid
}
enum class Type(override val value: Int) : EnumValue<Int> {
INVALID(-1), SIMPLE(1), COMPLEX(2);
companion object : EnumCompanion<Type, Int>(values(), INVALID)
}
comments?nkiesel
04/01/2020, 1:24 AMprivate val valueMap = values.associateBy { it.value }
private val nameMap = values.associateBy { it.toString() }
fun fromValue(value: U) = valueMap.getOrDefault(value, invalid)
fun fromName(name: String) = nameMap.getOrDefault(name, invalid)
nkiesel
04/01/2020, 1:45 AM