bod
02/14/2019, 11:20 AMenum class MyEnum(val key: String) {
FOO("foo"),
BAR("bar"),
UNKNOWN("unknown");
companion object {
fun getByKey(key: String?): MyEnum {
return MyEnum.values().firstOrNull { it.key == key } ?: MyEnum.UNKNOWN
}
}
}
I’m looking for a way to not repeat this companion object for all our enums. Possibly a combination of an interface and a generic extension function? Any idea? 🙂dany
02/14/2019, 11:48 AMinterface LookableByKey { val key: String }
?marstran
02/14/2019, 11:56 AMinterface EnumCompanion<T : LookableByKey<*>> {
val default: T
fun values(): Array<T>
fun getByKey(key: String?): T = values().firstOrNull { it.key == key } ?: default
}
interface LookableByKey<T> {
val key: T
}
enum class MyEnum(override val key: String): LookableByKey<String> {
FOO("foo"),
BAR("bar"),
UNKNOWN("unknown");
companion object : EnumCompanion<MyEnum> {
override fun values() = MyEnum.values()
override val default = UNKNOWN
}
}
bod
02/14/2019, 12:35 PMdany
02/14/2019, 12:43 PMfun <T> Enum<T>.getByKey() : Enum<T>
?marstran
02/14/2019, 12:45 PMvalues()
is not part of the Enum
class, you have to provide that function as well.bod
02/14/2019, 12:46 PMmarstran
02/14/2019, 12:46 PMBAR.getByKey()
. It won't allow you to do MyEnum.getByKey()
.bod
02/14/2019, 12:47 PMenumValueOf
, I wonder if it could be of any helpdany
02/14/2019, 12:49 PMmarstran
02/14/2019, 12:51 PMenumValues
. That may make it simpler. 2 secbod
02/14/2019, 12:55 PMmarstran
02/14/2019, 12:56 PMinterface EnumCompanion<T> {
val default: T
}
inline fun <reified T> EnumCompanion<T>.getByKey(key: String?): T
where T : Enum<T>, T : LookableByKey<*> {
return enumValues<T>().find { it.key == key } ?: default
}
interface LookableByKey<T> {
val key: T
}
enum class MyEnum(override val key: String): LookableByKey<String> {
FOO("foo"),
BAR("bar"),
UNKNOWN("unknown");
companion object : EnumCompanion<MyEnum> {
override val default = UNKNOWN
}
}
bod
02/14/2019, 12:58 PMwhere
used before, I guess that’ll be a first for me 😉marstran
02/14/2019, 1:00 PMLookableByKey
interface as well if you change the EnumCompanion
to this: interface EnumCompanion<T, K> {
fun T.key(): K
val default: T
}
bod
02/14/2019, 2:01 PM