Solía definir un conjunto de constantes relacionadas como Bundle
claves juntas en una interfaz como la siguiente:
public interface From{
String LOGIN_SCREEN = "LoginSCreen";
String NOTIFICATION = "Notification";
String WIDGET = "widget";
}
Esto me proporciona una forma más agradable de agrupar constantes relacionadas y usarlas haciendo una importación estática (no implementaciones). Sé Android
marco también utiliza las constantes en la misma manera como Toast.LENTH_LONG
, View.GONE
.
Sin embargo, a menudo siento que Java Enums
proporcionan una forma mucho mejor y poderosa de representar la constante.
Pero hay un problema performence en el uso enums
de Android
?
Con un poco de investigación terminé confundido. A partir de esta pregunta
"Evitar enumeraciones donde solo necesita Ints" se eliminó de las sugerencias de rendimiento de Android, queda claro que Google
se eliminó "Evitar enumeraciones" de sus sugerencias de rendimiento, pero de sus documentos de capacitación oficiales Tenga en cuenta la sección de sobrecarga de memoria que dice claramente: "Enums a menudo requieren más del doble de memoria que las constantes estáticas. Debes evitar estrictamente el uso de enumeraciones en Android. " ¿Sigue siendo válido? (Por ejemplo, en Java
versiones posteriores a la 1.6).
Un problema más que observé es enviar a enums
través del intents
uso Bundle
. Debería enviarlos serializando (es decir putSerializable()
, creo que es una operación costosa en comparación con el putString()
método primitivo , aunque lo enums
proporciona de forma gratuita).
¿Alguien puede aclarar cuál es la mejor manera de representar lo mismo Android
? ¿Debo estrictamente evitar el uso enums
de Android
?
Enum.ordinal()
lugar.Respuestas:
Úselo
enum
cuando necesite sus características. No lo evites estrictamente .La enumeración de Java es más poderosa, pero si no necesita sus características, use constantes, ocupan menos espacio y pueden ser primitivas en sí mismas.
Cuándo usar la enumeración:
sobrecarga de métodos: cada constante de enumeración tiene su propia implementación de un método
más datos: su única constante contiene más de una información que no se puede poner en una variable
Cuando no usar enum:
puedes aceptar datos continuos
Las enumeraciones ocupan más espacio
Las constantes ocupan menos espacio
fuente
Si las enumeraciones simplemente tienen valores, debe intentar usar IntDef / StringDef, como se muestra aquí:
https://developer.android.com/studio/write/annotations.html#enum-annotations
Ejemplo: en lugar de:
tu usas:
y en la función que lo tiene como parámetro / valor devuelto, use:
En caso de que la enumeración sea compleja, use una enumeración. No está tan mal.
Para comparar enumeraciones frente a valores constantes, debe leer aquí:
Su ejemplo es de una enumeración con 2 valores. Se necesitan 1112 bytes en un archivo dex en comparación con 128 bytes cuando se utilizan enteros constantes. Tiene sentido, ya que las enumeraciones son clases reales, a diferencia de cómo funciona en C / C ++.
fuente
IntDef
anotación, lo hará. En cuanto a los relojes, creo que también está bastante claro. ¿Qué dispositivo tiene más potencia de CPU, RAM y batería: un teléfono o un reloj? ¿Y cuáles necesitan que el software esté más optimizado para el rendimiento debido a eso?Además de las respuestas anteriores, agregaría que si está utilizando Proguard (y definitivamente debería hacerlo para reducir el tamaño y ofuscar su código), entonces
Enums
se convertirá automáticamente a@IntDef
donde sea posible:https://www.guardsquare.com/en/proguard/manual/optimizations
Por lo tanto, si tiene algunos valores discretos y algún método debería permitir tomar solo estos valores y no otros del mismo tipo, entonces usaría
Enum
, porque Proguard hará que este manual funcione de optimización de código para mí.Y aquí hay una buena publicación sobre el uso de enumeraciones de Jake Wharton, échale un vistazo.
fuente
No. " Estrictamente " significa que son tan malos que no deben usarse en absoluto. Es posible que surjan problemas de rendimiento en una situación extrema como muchas muchas (miles o millones de) operaciones con enumeraciones (consecutivas en el hilo de la interfaz de usuario). Mucho más comunes son las operaciones de E / S de red que deberían ocurrir estrictamente en un hilo de fondo. El uso más común de enumeraciones es probablemente algún tipo de verificación de tipo: si un objeto es esto o aquello que es tan rápido, no podrá notar una diferencia entre una sola comparación de enumeraciones y una comparación de enteros.
No existe una regla general para esto. Utilice lo que funcione para usted y le ayude a preparar su aplicación. Optimice más tarde, después de que note que hay un cuello de botella que ralentiza algún aspecto de su aplicación.
fuente
Con Android P, Google no tiene restricciones / objeciones en el uso de enumeraciones
La documentación ha cambiado donde antes se recomendaba ser cauteloso, pero ahora no lo menciona. https://developer.android.com/reference/java/lang/Enum
fuente
Dos hechos.
1, Enum es una de las funciones más poderosas de JAVA.
2, el teléfono Android suele tener MUCHA memoria.
Entonces mi respuesta es NO. Usaré Enum en Android.
fuente
Me gusta agregar que no puede usar @Annotations cuando declara una List <> o Map <> donde la clave o el valor es de una de sus interfaces de anotación. Aparece el error "No se permiten anotaciones aquí".
Entonces, cuando necesite empaquetarlo en una lista / mapa, use enum, ya que se pueden agregar, pero @annotated int / string groups no.
fuente