Tengo un escenario en el que tengo tipos de reproductores 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¿Por qué usar Enums en lugar de Constants?
Respuesta
supongamos que utiliza cadenas constantes (o int
valores - 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 termina sin saber realmente el tipo de los datos - que conduce a código potencialmente incorrecto:
String playerType = Constants.MALE;
Si utiliza enumeraciones, que terminaría como:
// Compile-time error - incompatible types!
PlayerType playerType = Gender.MALE;
Asimismo, enumeraciones dar a 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, enumeraciones en Java pueden tener más información asociada con ellos, y también puede tener comportamiento. Mucho mejor en todos los sentidos.
Muchas gracias por una respuesta tan detallada y agradable. – Waqas
¿Qué pasa con la comparación de rendimiento entre Enums y Constants? – Waqas
@ waqas716: Los enumeraciones son tipos de referencia, pero solo hay un objeto por valor, por lo que es poco probable que desperdicie mucha memoria. Si quieres otras diferencias de rendimiento, deberías decir lo que te interesa. –
Las enumeraciones lo limitan al conjunto de entradas requeridas, aunque 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 programa.
Además, siempre puede usar sus enumeraciones como una cadena si lo desea. Aquí hay un reference.
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 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)
@Jon Skeet: ¿Qué dice al respecto? – Waqas
A veces, la seguridad de tipo vale el costo de la "sobrecarga adicional". –
Además de no poder proporcionar un valor incorrecto, existe otra característica de enumeraciones que pueden parecer menores, 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.
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. Referirse a esta respuesta para el ejemplo y explicación: -
IntDef/StringDef Example
También puede comprobar el código fuente de Android que está reemplazando las enumeraciones con IntDef/StringDef siempre que sea posible. Ex. View.VISIBLE.
- 1. ¿Por qué mis enums C# no funcionan?
- 2. ¿Por qué los Enums se compilaron como constantes en lugar de valores estáticos?
- 3. por qué usar - en lugar de _ en la url
- 4. ¿Qué hace '^' en C# (Enums)?
- 5. ¿Por qué usar string :: iterator en lugar de index?
- 6. ¿Por qué debería usar git en lugar de svn?
- 7. Por qué/cuándo usar (!! p) en lugar de (p! = NULO)
- 8. ¿Por qué usar tuplas en lugar de objetos?
- 9. ¿por qué debería usar content_tag en lugar de html "normal"?
- 10. ¿Por qué usar curl en lugar de otros métodos?
- 11. ¿Por qué debería usar var en lugar de un tipo?
- 12. ¿Por qué usar Apio en lugar de RabbitMQ?
- 13. ¿Por qué debería usar url.openStream en lugar de url.getContent?
- 14. ¿Por qué usar System.Threading.Interlocked.Decrement en lugar de menos?
- 15. ¿Por qué usar C typedefs en lugar de #defines?
- 16. ¿Por qué usar ROLAP en lugar de simplemente MySQL?
- 17. ¿Por qué usar char [] en lugar de String?
- 18. ¿Por qué usar var en lugar del nombre de clase?
- 19. ¿Por qué debería usar operator.itemgetter (x) en lugar de [x]?
- 20. ¿Por qué usar GWT.create() en lugar de nuevo?
- 21. ¿Por qué usar registerDefaults: en lugar de setValue: forKey :?
- 22. ¿Por qué usar AsQueryable() en lugar de List()?
- 23. ¿Por qué usar select() en lugar de sleep()?
- 24. Android: por qué debe usar getBaseContext() en lugar de este
- 25. ¿Por qué usar argparse en lugar de optparse?
- 26. ¿Por qué usar boost :: ice_or en lugar de || y boost :: ice_and en lugar de && en enable_if?
- 27. ¿Qué puedo usar en lugar de eval()?
- 28. ¿Por qué las enums de unboxing producen resultados extraños?
- 29. ¿Por qué no es aconsejable usar attach() en R, y qué debería usar en su lugar?
- 30. nodejs: ¿qué usar en lugar de require.paths?
No utilizaría una variable String. En todo caso, una variable 'int' (con constantes muy bien llamadas para los diversos tipos). – Thilo
es esta respuesta algo bueno para usted? http://stackoverflow.com/questions/613837/enums-and-constants-which-to-use-when?rq=1 – Jimmy
posible duplicado de [¿Para qué sirve Enum?] (http://stackoverflow.com/ preguntas/11393389/what-is-enum-useful-for) – oers