Esta é uma classe Enum:
enum class Foo(rawValue: Int) {
FIRST(1),
SECOND(2)
}
Posso usar companion object
para recuperar o tipo pelo valor bruto:
enum class Foo(rawValue: Int) {
FIRST(1),
SECOND(2)
companion object {
fun getCaseBy(value: Int): Foo? {
return entries.firstOrNull { it.rawValue == value }
}
}
}
Então use assim:
Foo.getCaseBy(1)
Existe alguma maneira de usar um tipo genérico para colocar isso getCaseBy
em interface
? Então não há necessidade de adicionar esse método para cada enum?
Algo como:
interface EnumInterface<T> {
companion object {
fun getCaseBy(value: E): T? {
return T.entries.firstOrNull { it.rawValue == value }
}
}
}
enum class Foo(rawValue: Int): EnumInterface(Foo::class) {
FIRST(1),
SECOND(2)
}
T
é restrito àEnum
classe,E
éT
o tipo rawValue de retrieve.- Somente
Enum
o tipo pode confirmar esta interfaceEnumInterface
Isso é possível?
Esta é uma implementação mais limpa inspirada no comentário de Louis Wasserman .
Se você acha que substituir
predicate
a função é muito problemático, você pode aplicar o mesmo método da versão antiga abaixo para criar uma anotação para o campo-chave.Esta é a versão antiga .
Você pode implementar isso por meio da reflexão.
Como a classe enum pode ter vários nomes de propriedade, a anotação
Key
é usada para marcar a propriedade usada para comparação.Observe que se nenhuma propriedade for anotada,
getValue
será gerado umNoSuchElement
erro.