Android: enum vs static final ints?

¿Cuáles son las ventajas (o desventajas) de tener un enum versus tener un conjunto de static final int en aplicaciones Java Android? ¿Existen optimizaciones de rendimiento o rendimiento que favorezcan el uso de uno u otro?

Le pregunto esto en el contexto de decir intención requestCodes y tal – que tienden a ser ints en el código de ejemplo de Android, en contraposición a los valores de un enum, que estaba acostumbrado en C.

Enum ventajas de esta pregunta :

  • 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.

Yo podria agregar:

  • Los enums pueden tener variables de miembro e instancia, mientras que un int no puede.

Como la mayoría de las abstracciones, son generalmente inequívocamente ventajosas una vez que su funcionamiento alcanza para arriba . Especialmente en su código de aplicación (en contraposición al código de marco) yo elegiría enums sobre otros métodos que los simulan.

Una respuesta muy simple de las experiencias personales sería que los Enums proporcionan mucho mejor seguridad de tipo o en otras palabras, el compilador llega a jugar un papel más activo en mantener su código libre de errores.

Por otro lado, debido a que los Enums son "ciudadanos de segunda clase" del mundo de objetos, pueden ser difíciles de usar en algunos de los patrones de diseño más sutiles que se usan hoy en día, especialmente cuando los genéricos están involucrados.

Y, finalmente, puede utilizar static final ints en un campo de bits. No podrías hacer lo siguiente con un enum:

 int selectedOptions = Options.OPTION1 | Options.OPTION2 | Options.OPTION3; 

Bueno … según un tipo calvo los Enums son realmente malos para la memoria .

Debe utilizar anotaciones @ IntDef / @ StringDef :

 public static final int NAVIGATION_MODE_STANDARD = 0; public static final int NAVIGATION_MODE_LIST = 1; public static final int NAVIGATION_MODE_TABS = 2; @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS}) public @interface NavigationMode {} 

y entonces

 @NavigationMode public abstract int getNavigationMode(); public abstract void setNavigationMode(@NavigationMode int mode); 

Una ventaja de los ints sobre los enums está en una FÁBRICA DE CLASE. El siguiente código C # no es extensible:

 class Factory { public enum DrawableType {CIRCLE,SQUARE}; public static Drawable GetInstance(DrawableEnum e) { if (e == DrawableType.CIRCLE) { return new Circle(); } else if (e == DrawableType.SQUARE) { return new Square(); } else { throw new IndexOutOfRangeException(); // should never get here } } 

Escribí este pobre código. Revisando patrones de diseño, la cuadrilla de cuatro usó un int. Intenté recuperarme aquí .

  • ¿Cómo obtener el último valor de BehaviorSubject?
  • Cómo crear un formato BKS (BouncyCastle) Java Keystore que contiene una cadena de certificados de cliente
  • Android Game Development - Mover el teléfono
  • Protocolos de alto nivel para Bluetooth / WiFi Direct Sockets?
  • Setter y Getter funciones. En Android. Rendimiento de gastos generales?
  • Temporizadores Android NDK
  • Error: No se encontró ningún recurso que coincida con el nombre dado (en 'title' con el valor '@ string / menu_settings')
  • En la API de GoogleCloudMessaging, ¿cómo manejar la renovación o caducidad del ID de registro?
  • Llamar a un método no estático fuera de la clase
  • GetExternalStorageDirectory () a getExternalFilesDir ()
  • ¿Es mala práctica mantener los datos en variables estáticas?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.