Sidebar

Las clases Enum despiertan mucha controversia en el mundo Android por una serie de razones, pero siguen demostrando ser utilizadas por desarrolladores experimentados día a día. ¿Por qué es así?

(Atención: aunque la sintaxis del código aquí va a ser en Kotlin, toda la información aquí se aplica para las clases Enum de Java también)

¿Qué es una clase Enum?

Simplemente, un Enum es un tipo de clase especial que contiene una lista de constantes. El uso más común de esto es para representar diferentes tipos de un objeto en particular, o cuando una variable sólo puede ser uno de un determinado conjunto de valores.

enum class Direction { NORTH, SOUTH, EAST, WEST}

Las constantes de un enum no requieren necesariamente un valor. Sin un valor, se pueden utilizar en la validación a través de ifs y sentencias switch.

val directionToTreasure = Direction.NORTHwhen(directionToTreasure) { Direction.NORTH -> indicateNorth() Direction.SOUTH -> indicateSouth() Direction.EAST -> indicateEast() Direction.WEST -> indicateWest()}

Probablemente no es la mejor manera de manejar estas funciones de indicación, pero usted consigue la idea. Al menos será muy divertido

Sin embargo, su uso puede ampliarse para incluir valores adjuntos a cada constante.

enum class Color(val rgb: Int) { RED(0xFF0000) GREEN(0x00FF00) BLUE(0x0000FF)}

Cuando usas las clases enum de esta manera, puedes obtener su valor así:

val shirtColour = Color.BLUEval color: Int = shirtColour.rgb

¿Qué más puede hacer un Enum?

Para decirlo en pocas palabras, un puto montón

En primer lugar, en lugar de constantes, los enum pueden ser implementados clases anónimas con sus propios métodos y anulando los métodos base.

enum class ProtocolState yadayada {}

También pueden implementar interfaces de forma similar

enum class IntArithmetics yadayada {}

Por último, los enum tienen dos constantes que te proporcionan algunos valores bastante útiles.

val name: String // The name of the constantval ordinal: Int // The position of the constant in the list of valuesif (shirtColour.name == "BLUE") { // Do some blue stuff}

De hecho, gracias al uso de estas constantes, también puedes mapear convenientemente entre los tipos enum y String/Int.

Enum -> Int

yourEnum.ordinal

Int -> Enum

EnumType.values()

String -> Enum

EnumType.valueOf(yourString)

Enum -> String

yourEnum.name

Créditos a este chico en StackOverflow por compartir este mapeo

¿Para qué sirven las clases Enum?

Te entiendo, no es lo más sencillo, pero te pongo al corriente.

Por lo general, las clases enum se utilizan para producir un código más legible. Cuando tienes un objeto que puede tener varios tipos diferentes, es mucho más conciso identificarlos con un valor legible que algún número entero arbitrario.

// Bad codewhen(direction) { 0 -> goNorth() 1 -> goSouth() 2 -> goEast() 3 -> goWest()}// Good codewhen(direction) { Direction.NORTH -> goNorth() Direction.SOUTH -> goSouth() Direction.EAST -> goEast() Direction.WEST -> goWest()}

Otro propósito útil de los Enums es cuando tienes datos que entran como una cadena pero necesitas eventualmente mapearlos a un valor int, como cuando tu API da el tipo de tu objeto pero necesitas pasarlo a un Adaptador RecyclerView que requiere un Int para los tipos View. Personalmente utilicé este método en mi clase Enum para hacer que eso suceda.

@JvmStaticfun getType(type: String): BlockType? = when(type) { "hero" -> ContentHero "products" -> ContentProductList else -> null }

Por qué no deberías usar clases Enum

Apuesto a que ahora estás pensando «Espera un segundo. Me has contado todo sobre cómo usar Enums y ahora me vas a decir que no los use?». Escúchame amigo.

Simplemente, ¡los Enums son caros amigo! Sé que los teléfonos móviles mejoran día a día pero, por un lado, todavía hay demasiada gente con teléfonos menos potentes y, por otro, la forma en que hacemos las aplicaciones y las librerías que utilizamos también consumen más memoria.

Esta es una noticia vieja. Los Enums serían un problema de memoria para los teléfonos que se ejecutan con Dalvik pero eso básicamente ha sido descontinuado en lugar del ART (Android Runtime Machine). Sumado al hecho de que incluso la gente en los países más pobres tienen teléfonos bastante potentes, y que Proguard ahora puede optimizar el código mejor que nunca, es seguro decir que los Enums ya no causan un problema en el rendimiento.

Todavía hay algunas alternativas que puede utilizar que pueden lograr resultados similares a una clase Enum.

Constantes

Los constantes son súper concisos también. Mantienen un único valor y le dan un nombre. También son extremadamente ligeros.

*Def

La anotación *Def también es grande si usted tiene una variable que sólo toma en ciertos valores.

@IntDef({RED, GREEN, BLUE})

¿Por qué todavía elegir Enums sobre estas alternativas?

Donde el enum brilla mucho más que sus hermanos funcionales es la exhaustividad. Cuando se usa con Kotlin, puedes usar una sentencia switch como esta

val foo = when(someEnum) {}

Y cuando lo haces, estás obligado a manejar un caso para cada constante en tu enum, de lo contrario tu código no compilará. Con constantes y anotaciones *def, lo mejor que te dan son advertencias de lint. Los enums simplemente conducen a un código más seguro.

(Créditos a u/-manabreak de Reddit por esto)

Así que mientras tu uso de enums conduzca a un código más conciso para tu aplicación y especialmente en el caso de Kotlin, a una mejor seguridad de casos, por todos los medios, enumera a tu gusto.

Deja un comentario