Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Por qué Android no usa más enums?

Comencé realmente a usar C # y Java enums en mi código por varias razones:

  • Son mucho más seguros que los números enteros, las cadenas o los conjuntos de banderas booleanas.
  • Ellos conducen a un código más legible.
  • Es más difícil establecer un enum para un valor no válido que un int o una cadena.
  • Facilitan el descubrimiento de los valores permitidos para una variable o parámetro.
  • Todo lo que he leído indica que funcionan tan bien como números enteros en C # y la mayoría de las JVM.

Sin embargo, el framework de Android tiene numerosos casos en los que se necesitan pasar banderas de varios tipos, pero ninguno parece usar enums. Un par de ejemplos donde yo creo que su uso sería beneficioso son Toast.LENGTH_SHORT / Toast.LENGTH_LONG y View.GONE , View.VISIBLE , etc

¿Por qué es esto? ¿Los enums tienen peores resultados que los simples valores enteros en Dalvik? ¿Hay algún otro inconveniente que no conozco?

  • ¿De dónde viene Enum.values ​​()?
  • Cómo pasar un valor enum a wcf webservice
  • GWT y Android. Problema de serialización de Enum
  • Enums y la anotación android intDef
  • Cómo asignar Enum en GreenDAO
  • ¿Por qué "Eliminar los Enums en los que sólo necesita Ints" se eliminó de las sugerencias de rendimiento de Android?
  • Escribir enum con String a paquete
  • ¿Por qué usar Enums en lugar de Constantes?
  • 3 Solutions collect form web for “¿Por qué Android no usa más enums?”

    Esta respuesta está desfasada en marzo de 2011.

    Los enums se pueden usar en Froyo y hasta – de acuerdo con esta respuesta ( ¿Por qué fue "Evitar Enums donde sólo necesita Ints" eliminado de las sugerencias de rendimiento de Android? ) De un miembro del equipo de VM de Android (y su blog ).


    Respuesta anterior:

    La recomendación oficial del equipo de Android es evitar enums siempre que puedas evitarlo:

    Enums son muy convenientes, pero por desgracia puede ser doloroso cuando el tamaño y la velocidad de la materia. Por ejemplo, esto:

     public enum Shrubbery { GROUND, CRAWLING, HANGING } 

    Agrega 740 bytes a su archivo .dex en comparación con la clase equivalente con tres ints finales estáticos públicos. En el primer uso, el inicializador de clase invoca el método en objetos que representan cada uno de los valores enumerados. Cada objeto obtiene su propio campo estático, y el conjunto completo se almacena en un array (un campo estático llamado "$ VALUES"). Eso es un montón de código y datos, sólo por tres enteros. Además, esto:

     Shrubbery shrub = Shrubbery.GROUND; 

    Causa una búsqueda de campo estático. Si "GROUND" era un int estático final, el compilador lo trataría como una constante conocida y en línea.

    Fuente: Evite los Enums donde sólo necesita Ints

    Los números enteros son más pequeños y requieren menos sobrecarga, algo que todavía importa en los dispositivos móviles.

    Un colega mío realizó una pequeña prueba con respecto a esta situación. Auto generó una class y un enum con la misma cantidad de "enums". Creo que generó 30000 entradas.

    Los resultados fueron:

    • .class para la class fue de aproximadamente 1200KB
    • .class para el enum era aproximadamente 800KB

    Espero que esto ayude a alguien.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.