Enumeradores

Enumeradores

Observação: O arquivo utilizado neste conteúdo que fala sobre enumeradores é o 5-enums.kt.

Pronto para mais um conteúdo?

Classes do tipo ENUM

Enums, cuja tradução é enumeradores, nada mais são do que classes abstratas (que não pode ser instanciadas), que servem apenas para armazenar um conjunto de constantes que possuem valores pré-definidos.

Enums são utilizados como uma forma de evitar os famosos magic numbers.

O que são Magic Numbers?

Magic Numbers cuja tradução é números mágicos, é um termo usado em informática para designar constantes especiais usadas para definir um certo propósito, usualmente escolhidas de forma arbitrária.

Por exemplo, vamos supor que em uma determinada parte do nosso sistema, nós criamos o seguinte código:

if(valor == 0){
println("Prioridade é BAIXA")
}

if(valor == 1){
println("Prioridade é MÉDIA")
}

if(valor == 2){
println("Prioridade é ALTA")
}

Apesar dos valores 0, 1 e 2 fazerem sentido para quem escreveu o código. Talvez seja de difícil entendimento para aquele que se deparam com o código pela primeira vez.

De acordo com o livro "Código Limpo", devemos evitar esses usos, e preferir utilizar constantes que dizem o significado daqueles números.

E isso pode ser feito da seguinte forma:

if(valor == Prioridade.BAIXA){
println("Prioridade é BAIXA")
}

if(valor == Prioridade.MEDIA){
println("Prioridade é MÉDIA")
}

if(valor == Prioridade.ALTA){
println("Prioridade é ALTA")
}

Trabalhando com Enums

Veja abaixo como criar uma classe em Kotlin do tipo enum, que contém 3 constantes iniciais:

enum class Prioridade{//Classe do tipo enumerador, que armazena prioridades
Baixa, Media, Alta
}

Note que as constantes não precisam estar atribuídas a nenhum tipo de valor.

Veja um outro exemplo de classe do tipo enum que armazena o nome de alguns animais:

enum class AnimalEnum{
Cachorro, Gato, Cavalo, Vaca, Morcego
}//Os valores não precisam de uma definição

Legal, agora vamos analisar como podemos selecionar uma daquelas constantes da classe Prioridades:

println(Prioridade.Baixa.toString())//Podemos usar o toString para retornar 'Baixaem formato de STRING

Agora supondo que temos uma função que recebe um tipo de dado da classe Prioridade, poderíamos fazer isso da seguinte forma:

fun minhasPrioridades(p: Prioridade){//Essa função só aceita 3 tipos de prioriedades
//O ganho da classe ENUM é que ela limita a quantidade de valores
println(p.toString())
}

...

minhasPrioridades(Prioridade.Baixa)//Passando uma prioriedade para a função

Uma outra forma de percorrer todas as prioridades de uma classe enum, é usando o for:

for (p in Prioridade.values()){//Com o values pegamos as prioridades uma por uma
if(p == Prioridade.Alta){//Modo de fazer verificações em prioridades
println("Prioridade bastante alta, cuidado...")
}
println(p)
}

Enums com Valores

No Kotlin, também é possível definirmos classes do tipo enum de modo a atribuir valores a eles, observe:

enum class Tipos(val valor: Int){//Exemplo de enumerados que estão atrelados com valores
Bom(60), Ruim(44), Excelente(100)
}

No caso delas, você é obrigado a definir um atributo no construtor da classe, como fizemos acima com o atributo valor.

Para selecionar uma daquelas constantes, podemos fazer:

println(Tipos.Excelente.valor)//Pegamos um valor de um tipo específico

Ou quem sabe, utilizar um for:

for (p in Tipos.values()){
println("Tipo: ${p}, Vale: ${p.valor}")//Aqui estamos acessando cada valor atrelado ao tipo de enum
}

Override no ToString()

Caso preferir, você pode fazer um override no método toString dentro de uma constante, de modo a retornar um valor diferente quando você tentar acessar por este método, veja:

enum class TiposDois(val id: Int){
Uno(12){
override fun toString(): String {//Aqui estamos usando a função override para sobescrevendo a função toString que existia
return "Unor"//Retorno diferenciado, em evz de retornar 12, retorna 'Unor'
}
},
Tup(23)//Essa constante não tem override, nesse caso retorna sempre 23
}

Conclusão

Neste conteúdo você aprendeu um pouco mais sobre as diferentes formas de se declarar uma classe do tipo enum.

Até o próximo conteúdo 😀