¿Por qué usar Enums en lugar de Constants?

Tengo un escenario en el que tengo tipos de reproductor ARCHER, WARRIOR y hechicero. ¿Qué debería usar en la clase de jugador? Una variable String para tipo o un Enum? Por qué enum y por qué Constant Strings. Por favor ayuda con las razones

Supongamos que usa cadenas constantes (o valores int , lo mismo vale para ellos):

 // Constants for player types public static final String ARCHER = "Archer"; public static final String WARRIOR = "Warrior"; // Constants for genders public static final String MALE = "Male"; public static final String FEMALE = "Female"; 

entonces terminas sin saber realmente el tipo de tus datos, lo que lleva a un código potencialmente incorrecto:

 String playerType = Constants.MALE; 

Si usa enumeraciones, eso terminaría como:

 // Compile-time error - incompatible types! PlayerType playerType = Gender.MALE; 

Del mismo modo, las enumeraciones dan un conjunto restringido de valores:

 String playerType = "Fred"; // Hang on, that's not one we know about... 

vs

 PlayerType playerType = "Fred"; // Nope, that doesn't work. Bang! 

Además, las enumeraciones en Java pueden tener más información asociada a ellas y también pueden tener un comportamiento. Mucho mejor en todos los sentidos.

Las enumeraciones lo limitan al conjunto de entradas requeridas, e incluso si utiliza cadenas constantes, puede utilizar otra cadena que no sea parte de su lógica.

Esto le ayuda a no cometer un error, a ingresar algo fuera del dominio, mientras ingresa datos y también mejora la legibilidad del progtwig.

Además, siempre puedes usar tus enums como String si lo deseas. Aquí hay una referencia .

Además de no permitirle proporcionar un valor incorrecto, existe otra característica de las enumeraciones que puede parecer menor, pero en mi opinión es bastante importante. Los IDE modernos pueden sugerir valores automáticamente para enumeraciones, mientras que no hay forma de inferir de manera confiable los valores posibles de una constante de cadena (Intellij IDEA hace lo último, pero solo para clases JDK y bibliotecas populares). Esto es especialmente útil cuando explora una nueva API.

Te aconsejaría que uses enumeraciones solo si realmente necesitas constantes enumeradas, o alguna funcionalidad adicional común para todos los artículos.

Eso, por supuesto, depende del tipo de aplicación que está escribiendo y de qué versiones y dispositivos desea admitir.

La razón es que las enumeraciones agregan sobrecarga porque asignan instancias de sus elementos. Puedes notar que hay enumeraciones mínimas en la plataforma de Android, y casi todas las constantes son entradas estáticas finales (como View.GONE y cosas por el estilo)

Enum es mejor usarlo para la seguridad del tipo. Los valores incorrectos no se pueden ingresar. Pero enum en Android requiere tanta memoria, debería usar intdef en su lugar. Consulte esta respuesta para obtener ejemplos y explicaciones:

Ejemplo IntDef / StringDef

También puede verificar que el código fuente de Android esté reemplazando las enumeraciones con IntDef / StringDef siempre que sea posible. Ex. View.VISIBLE.